2.pandas基础
2.pandas基础
eddy_linux 发表于4个月前
2.pandas基础
  • 发表于 4个月前
  • 阅读 11
  • 收藏 0
  • 点赞 0
  • 评论 0
#encoding:utf8

'''
http://pandas.pydata.org/pandas-docs/stable/10min.html
10分钟了解pandas
'''

import pandas as pd
import numpy as np

#一行
s = pd.Series([1,3,5,np.NaN,8,4])
#打印出来第一列是索引号,第二列是值
print(s)

#二维数组DataFrame
dates = pd.date_range('20170801',periods=6)
print(dates)
data = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))
print(data)
print(data.shape)
print(data.values)

d = {'A':1,'B':pd.Timestamp('20160801'),'C':range(4),'D':np.arange(4)}
df = pd.DataFrame(d)
print(df)
print(df.dtypes)
print(df.A)

#看前两行
print(data.head(2))

#看最后2行
print(data.tail(2))

print(data.index)
print(data.columns)

print(data.values)

#最基本的统计数据
print(data.describe())
#转制也就是行列标签互换
print(data.T)
#排序
#列标签排序
print(data.sort_index(axis=1))
print(data.sort_index(axis=1,ascending=False))#降序
#行标签排序
print(data.sort_index(axis=0))
#按照某一列的值排序
print(data.sort(columns='A'))
#显示某一列
print(data['A'])
print(data.A)
#显示行
print(data[2:4])
#也可以选择行标签
print(data['20170801':'20170805'])
#推荐以下方式显示
print(data.loc['20170801':'20170803'])
print(data.iloc[2:4])
#同样也可以选择第几行第几列显示
print(data.loc[:,['A','B']])#显示每一行的A和B列
print(data.loc['20170801':'20170803',['A']])#显示行标签0801-0803的行的A列

#显示特定值
print(data.loc['20170801','B'])
print(data.at[pd.Timestamp('20170803'),'B'])
print(data.iloc[1:3,0:2])
print(data.iloc[1,0])
print(data.iat[1,0])
#推荐用at和iat

#条件
print(data[data.A >0])
print(data[data > 0 ])

data2 = data.copy()
tag = ['a'] * 2 + ['b'] * 2 + ['c'] * 2
data2['TAG'] = tag
print(data2)
print(data2[data2.TAG.isin(['a','c'])])#把TAG列里面是a和c的值过滤出来

#修改元素值
print(data)
data.iat[0,0] = 100
print(data)
#修改一列
data.A = range(6)
print(data)
data.B = 200
print(data)

#encoding:utf8
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

dates = pd.date_range('20170801',periods=6)
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))
print(df)

#新增加一列
df1 = df.reindex(index=dates[0:4],columns=list(df.columns)+['E'])
print(df1)
#给列赋值
df1.loc[dates[1:3],'E']=2
print(df1)

#丢弃空值
print(df1.dropna())
#填充空值
print(df1.fillna(value=5))
#原值不会改变的
print(df1)
#显示是否有空值返回布尔值
print(pd.isnull(df1).any().any())

#列平均值
print(df1.mean())
#行平均值
print(df1.mean(axis=1))
#累加值
print(df1)
#这里要注意空值不会参与计算,每一行的每一列显示的是当前列的值和之前所有列的值累加
print(df1.cumsum())
#累加值
print(df.apply(np.cumsum))

#统计元素出现的次数
s = pd.Series(np.random.randint(10,20,size=20))
print(s)
print(s.value_counts())
#出现次数最多的
print(s.mode())
#元素合并
df = pd.DataFrame(np.random.randn(10,4),columns=list('ABCD'))
print(df)
print(df.iloc[0:3])
#合并
df1 = pd.concat([df.iloc[:3],df.iloc[3:7],df[7:]])
print(df1)
#验证合并
print(df == df1)
print((df == df1).all().all())

#类似sql的外键,可以对列进行联合查询
#select * from left inner join right on left.key = right.key;
left = pd.DataFrame({'key':['foo','foo'],'lval':[1,2]})
right = pd.DataFrame({'key':['foo','foo'],'lval':[4,5]})
print(left)
print(right)
print(pd.merge(left,right,on='key'))

#另一个合并通过插入方式
s = pd.Series(np.random.randint(1,5,size=4),index=list('ABCD'))
print(s)
print(df)
print(df.append(s,ignore_index=True))

#通过插入的方式如果列数不同会默认为Nan直到有值才会进行填充
s = pd.Series(np.random.randint(1,5,size=5),index=list('ABCDE'))
print(s)
print(df.append(s,ignore_index=True))

#分类统计
df = pd.DataFrame({
    'A':['foo','bar','foo','bar','foo','bar','foo','foo'],
    'B':['one','one','two','three','two','two','one','three'],
    'C':np.random.randn(8),
    'D':np.random.randn(8)
    })
print(df)
#把A列进行分组并且求和
print(df.groupby('A').sum())
#多列分组
print(df.groupby(['A','B']).sum())
print(df.groupby(['B','A']).sum())

#encoding:utf8

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#数据整形
#构建行索引
tuples = list(zip(*[
        ['bar','bar','baz','baz','foo','foo','qux','qux'],
        ['one','two','one','two','one','two','one','two']
                    ]
))
index = pd.MultiIndex.from_tuples(tuples,names=['first','second'])
df = pd.DataFrame(np.random.randn(8,2),index=index,columns=['A','B'])
print(df)
#把列索引变为行索引
print(df.stack())
#把行索引变为列索引
print(df.unstack())
#当然如果有多层索引这里也可以执行多次转换



#数据透视
df = pd.DataFrame({
    'A':['one','one','two','three'] * 3,
    'B':['A','B','C'] * 4,
    'C':['foo','foo','foo','bar','bar','bar'] * 2,
    'D':np.random.randn(12),
    'E':np.random.randn(12),
    })
print(df)
#以A和B为行索引C为列索引看D的值
print(df.pivot_table(values=['D'],index=['A','B'],columns=['C']))
#以A为行索引C为列索引看E的值
print(df.pivot_table(values=['D'],index=['A'],columns=['C']))
#注意如果透视的数据有多项将会求平均值并填入相应位置,如果没有使用Nan



#时间序列
rng = pd.date_range('20160801',periods=600,freq='s')
s = pd.Series(np.random.randint(0,500,len(rng)),index=rng)
print(s)
#重新采样
#每两分钟采用求和
print(s.resample('2Min').sum())
#每两分钟采用平均值
print(s.resample('2Min').mean())
#以季度为单位
rng = pd.period_range('2000Q1','2016Q1',freq='Q')
print(rng)
#可以进行时间戳转换
print(rng.to_timestamp())
#对时间进行加减
print(pd.Timestamp('20170801') - pd.Timestamp('20170701'))
print(pd.Timestamp('20170801') + pd.Timedelta(days=5))
#类别数据
df = pd.DataFrame({'id':[1,2,3,4,5,6],'raw_grade':['a','a','b','b','a','d']})
print(df)
df['grade'] = df.raw_grade.astype('category')
print(df)
print(df.grade.cat.categories)
#可以对categories进行重新赋值
df.grade.cat.categories = ['very good','good','bad']
print(df)
#对grade排序实际是对grade的值进行排序
print(df.sort_values(by='grade',ascending=True))



#数据可视化
s = pd.Series(np.random.randn(1000),index=pd.date_range('20000101',periods=1000))
print(s)
s = s.cumsum()
print(s)
a = plt.plot(s)
print(plt.show(a))



#数据载入和保存
df = pd.DataFrame(np.random.randn(100,4),columns=list('ABCD'))
print(df)
#写入到磁盘
df.to_csv('data.csv')
#从磁盘读取
a = pd.read_csv('data.csv',index_col=0)
print(a)

 

共有 人打赏支持
粉丝 19
博文 132
码字总数 185568
×
eddy_linux
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: