三种数据结构
Series 带标签的一维:
DataFrame 带标签且大小可变的二维表格结构;
Panel带标签且大小可变的三维数组
生成一维数组
import numpy as np
import pandas as pd
x = pd.Series([1, 3, 5, np.nan])
pd.Series(range(5))
pd.Series(range(5),index=list('abcde'))
pd.date_range(start='20180101',end='20181231',freq='H')
pd.date_range(start='20180101',end="20191231",freq="D")
pd.date_range(start='20180101',end="20181231",freq="M")
pd.date_range(start='20180101',end="20181231",freq="MS")
pd.date_range(start='202004090800',periods=5,freq='2H')
参数periods用来指定要生成的日期时间数据的数量。
pd.date_range(end='202004090800',periods=5,freq='2H')
二维数组DataFrame的操作
dates = pd.date_range(start='20180101',end="20181231",freq="M")
>>> pd.DataFrame(np.random.randn(12,4), index=dates,columns=list('ABCD'))
A B C D
2018-01-31 1.430764 -0.570509 2.001759 -0.378457
2018-02-28 0.101779 1.760331 -0.593329 0.545458
2018-03-31 0.332762 -1.806258 0.959218 -0.746761
2018-04-30 -0.490047 -0.488414 -0.105263 -1.957838
2018-05-31 -0.661250 0.398992 0.505101 0.227674
2018-06-30 1.411308 0.354013 0.520608 -0.749293
2018-07-31 1.121131 0.520885 -1.427931 0.582491
2018-08-31 -0.055597 -1.716857 0.087238 1.226895
2018-09-30 0.705485 -2.075625 0.524160 0.211684
2018-10-31 0.052462 0.138969 -1.655494 -0.737842
2018-11-30 1.014822 -2.091701 -0.553490 -0.222810
2018-12-31 -0.457446 -0.213122 0.053456 -0.659432
>>># 可以不带后面的index和columns两个参数
>>> pd.DataFrame(np.random.randn(12,4))
0 1 2 3
0 0.093899 1.174404 -0.278384 1.247693
1 0.796956 -0.821047 -1.689773 1.103342
2 -0.019589 1.795205 1.603527 1.443758
3 -1.526299 1.503343 -0.174814 -0.927228
4 1.825296 0.219742 0.714336 -2.137064
5 0.474488 1.153171 0.587585 -1.506265
6 0.914878 -0.937574 -0.261841 -0.302997
7 -1.551265 -0.726468 -1.278511 0.042968
8 1.108579 -0.445814 -0.143011 -0.599777
9 0.934322 -1.684607 -1.667692 -0.497206
10 -0.020138 -3.205168 -0.170677 -0.811614
11 0.791528 -0.483691 0.593668 -0.011199
查看二维数组数据
df.head()
df.head(3)
df.tail(2)
查看二维数组数据的 索引、列名和值
df.index
df.columns
df.values
查看二维数组数据的统计信息
df.describe()
对二维数组进行排序
df.sort_index(axis=0,ascending=False)#对索引进行降序排序
df.sort_index(axis=0,ascending=True)#对索引升序
df.sort_index(axis=1, ascending=False) #对列进行降序排序
df.sort_values(by='A')#按A列对数据进行升序排序
df.sort_value(by=['E','C'])
df['A']#选择某一列数据
60 in df['A']
60 in df['A'].values
df[0:2] #使用切片选择多行
df.loc[:,['A','c']] #选择多列 所有行
df.iloc[[0,2,3],[]0,4]#查询二维数组指定的多行、多列数据
df.iloc[0,1]
df.iloc[2,2]
df[df.A>50] #查询A列>50的所有行
df[df['E']=='test']查询E列为test的所有行
df[df['A'].isin([20,69])]#查询A列值为20或69的所有行
df.nlargest(3,['c'])
返回C列值最大的前3行
df.nlargest(3,['A']) #返回A列值最大的前三行
df.iat[0,2] = 3
df.loc[:,'D'] = np.random.randint(50,60,4)
df['C'] = -df['C']
df
from copy import deepcopy
dff = deepcopy(df)
dff['c'] = dff['C'] ** 2
dff
dff = df[:]
dff.loc[dff['c']==9.0,'D'] = 100
dff
#把C列值为9的数据行中的D列改为100
#把所有1替换为5
data = pd.DataFrame({'k1':['one']*3+['two']*4,'k2':[1,1,2,3,4,4]})
data.replace(1,5)
data.replace({1:5,'one':'ONE'})#使用字典指定替换关系
df1 = df.reindex(columns=list(df.columns)+['G'])#增加 一列,列明为G
#修改指定位置元素 该列其他元素仍为缺失值
df1.iat[0,6] = 3
#返回不包含缺失值的行
df1.dopna()
#使用指定值原地填充缺失值
df1['G'].fillna[5,inplace=True]
data.drop_duplicates()#返回新数组 删除重复行
data.drop_duplicates(['K1'])#删除k1列重复数据
data.drop_duplicates(['k1'],keep='last')
#对于重复数据只保留最后一个
二维数组异常值处理。
import numpy as np
import pandas as pd
data = pd.DataFrame(np.random.randn(500,4))
data.describe()
col2 = data[2] #获取列下标为2的数据
col2[col2>3.5] #查询该列中大于3.5的数据
col2[col2>3.0]
data[np.abs(data)>2.5] = np.sign(data) * 2.5
二维数组的映射
data = pd.DataFrame({'k1':['one'] * 3+['two'] * 4,'k2':[1,2,3,4,4,4,4]})
data
#使用可调用对象进行映射
data['k1'] = data['k1'].map(str.upper)
#使用字典表示映射关系
data['k1'] = data['k1'].map({'ONE':'one','TWO':'two'})
二维数组数据离散化
from random import randrange
data = [randrange(100) for _ in range(10)]#生成随机数
catagory = [0,30,70,100]
pd.cut(data.category)
pd.cut(data,category,right=False)#左闭右开
labels = ['low','middle','high']
pd.cut(data,category,right=False,labels = labels)#指定标签
pd.cut(data,4)
移位与频次统计
df1.shift(1)#数据下移一行 -1上移
df1['D'].value_counts()#直方图统计
df1['G'].value_counts()#统计G列数据分布情况
df2 = pd.DataFrame(np.random.randn(10,4))
df2
p1 = df2[:3]#拆分得到前三行数据
p2 = df2[3:7]
p3 = df2[7:]
df3 = pd.concat([p1,p2,p3])
分组计算
分组汇总与统计是数据处理时常用的技术之一。
df.diff()纵向一阶差分
df.diff(axis=1) #横向一阶差分
df.diff(periods=2)#纵向二阶差分
读写文件
df.to_excel('d:\\test.xlsx',sheet_name='dfg')
df = pd.read_excel('d:\\test.xlsx','dfg',index_col=None,na_value=['NA'])
df.to_csv('d:\\test.csv')
df = pd.read_csv('d:\\test.csv')
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.randn(1000,2),columns=['B','C']).cumsum()
df['A'] = pd.Series(list(range(len(df))))
plt.figure()
df.plot(x='A')
plt.show()
df = pd.DataFrame(np.random.randon(10,4),columns=['a','b','c','d'])
df.plot(kind='barch',stacked=True)
plt.show()
使用pandas读取文件data.csv中的数据,创建DataFrame对象,并删除其中所有缺失值;
2)使用matplotlib生成折线图,反应该饭店每天的营业额情况,并把图形保存为本地文件first.jpg;
3)按月份进行统计,使用matplotlib绘制柱状图显示每个月份的营业额,并把图形保存为本地文件second.jpg;
4)按月份进行统计,找出相邻两个月最大涨幅,并把涨幅最大的月份写入maxMonth.txt;
5)按季度统计该饭店2017年的营业额数据,使用matplotlib生成饼状图显示2017年4个季度的营业额分布情况,并把图形保存为本地文件third.jpg。
import pandas as pd
import matplotlib.pyplot as plt
from copy import deepcopy
df = pd.read_csv('data.csv',encoding='cp936')
df = df.dropna()
#生成并保存营业额折线图
plt.figure()
df.plot(x='日期')
plt.savefig('first.jpg')
按月统计。生成并保存柱状图
plt.figure()
df1 = deepcopy(df)
df1['month'] = df1['日期'].map(lamada x: x[:x.rindex('-')])
df1 = df1.groupby(by='month',as_index=False).sum()
df1.plot(x='month',kind='bar')
plt.savefig('second.jpg')
查找涨幅最大的月份,写入文件
df2 = df1.drop('month',axis=1).diff()
m = df2['销量'].nlargest(1).keys()[0]
with open('maxMonth.txt','w') as fp:
fp.write(df1.loc[m, 'month'])
按季度统计 生成并保存饼图
plt.figure()
one = df1[:3] ['销量'].sum()
two = df1[3:6]['销量'].sum()
three = df1[6:9]['销量'].sum()
four = df1[9:12]['销量'].sum()
plt.pie([one,two.three,four],
labels=['one','two','three','four'])
plt.savefig('third.jpg')