基本用法
生成时间序列
pd.date_range(start='20130101', end='20131231', freq='D')
生成数据框
pd.DataFrame(np.random.randn(12,4), index=dates, columns=list('ABCD'))
排序
#一般排序
df.sort_index(axis=0, ascending=False,inplace=True)
dff.sort_values(by=['A','B'], ascending=[True, False]) # A升序B降序
#reindex指定序列排序,对行列根据索引按指定序列排序
frame.reindex(index=[],columns=[])
切片选择行列
df.loc[:, ['A', 'C']] # 选择多列,等价于df[['A', 'C']]
df.loc[['zhang', 'zhou'], ['A', 'D', 'E']]# 同时指定多行与多列进行选择
df.iloc[0:3, 0:4] # 查询前3行、前4列数据
df[df.A>50] # 按给定条件进行查询
df[df['E']=='test'] # 按给定条件进行查询
df[df['A'].isin([20,69])]# 按给定条件进行查询
数据合并merge函数
>>> df1
a b c
0 0 50 60
1 1 51 61
2 2 52 62
3 3 53 63
4 4 54 64
>>> df3
a d
0 3 30
1 4 31
2 5 32
3 6 33
4 7 34
>>> pd.merge(df1, df3) # 内连接
a b c d
0 3 53 63 30
1 4 54 64 31
>>> pd.merge(df1, df3, how='right') # 右连接
a b c d
0 3 53.0 63.0 30
1 4 54.0 64.0 31
2 5 NaN NaN 32
3 6 NaN NaN 33
4 7 NaN NaN 34
>>> pd.merge(df1, df3, how='left') # 左连接
a b c d
0 0 50 60 NaN
1 1 51 61 NaN
2 2 52 62 NaN
3 3 53 63 30.0
4 4 54 64 31.0
>>> pd.merge(df1, df3, how='outer') # 外连接
a b c d
0 0 50.0 60.0 NaN
1 1 51.0 61.0 NaN
2 2 52.0 62.0 NaN
3 3 53.0 63.0 30.0
4 4 54.0 64.0 31.0
5 5 NaN NaN 32.0
6 6 NaN NaN 33.0
7 7 NaN NaN 34.0
replace函数
data.replace(1, 5) # 把所有1替换为5
data.replace([1,2],[5,6]) # 1->5,2->6
data.replace({1:5, 'one':'ONE'}) # 使用字典指定替换关系
删除插入行列
data.drop(5, axis=0) # 删除指定行
data.drop(3, inplace=True) # 原地删除
data.drop('k1', axis=1) # 删除指定列
data.insert(1,'lai',date) #在第二列插入lai
数据操作,类似Excel
# 替换数据
df['C'] = -df['C'] # 对指定列数据取反
df.nlargest(3, ['C']) # 返回指定列最大的前3行
dff[dff.sum(axis=1)==11] #所有求和(行求和)等于特定值的行
dff.loc[dff['C']==-3.0, 'D'] #C=-3的D
data['rank'] = data['age'].rank() # 增加一列位次序号,ascending,method参数
# 行列求和
>>> dff['ColSum'] = dff.apply(sum, axis=1) # 对行求和,增加1列
>>> dff.loc['RowSum'] = dff.apply(sum, axis=0) # 对列求和,增加1行
映射
data['k1'] = data['k1'].map(str.upper) # 使用函数进行映射
data['k1'] = data['k1'].map({'ONE':'one', 'TWO':'two'}) # 使用字典表示映射关系
data['k2'] = data['k2'].map(lambda x:x+5) # lambda表达式
data.index = data.index.map(lambda x:x+5) # 修改索引
data.columns = data.columns.map(str.upper) # 修改列名(改成大写)
dff.apply(lambda x:x-x.mean(), axis=1) # 横向计算离差
dff.applymap(lambda x:'%.1f'%x) # 批量格式化数据(保留一位小数)
dff['B'] = dff['B'].map(lambda x:'%.1f'%x)
分组计算,透视表
df4.groupby('A').sum() # 数据分组计算
df4.groupby(by=['A', 'B']).mean()
df4.groupby(by=['A', 'B']).aggregate({'C':np.mean, 'D':np.min}) # 分组后,C列使用平均值,D列使用最小值
#透视表
df.pivot(index='a', columns='b', values='c')
df.pivot(index='a', columns='b')['c']
data.pivot_table('花后15天',index='品种',columns='氮水平',aggfunc='mean')
#交叉表
pd.crosstab(index=df.a, columns=df.b)
pd.crosstab(index=df.a, columns=df.b, values=df.c, aggfunc='sum', margins=True)
缺失值处理
#找出缺失值的行索引,按照一定程序替换
nan_indexset = set(np.where(np.isnan(result.iloc[:,1:]))[0])
nan_index = list(nan_indexset)
df1['G'].fillna(5, inplace=True) # 使用指定值填充缺失值
df2.fillna({'F':'foo', 'G':df2['G'].mean()}) # 填充缺失值F行为foo,G行为均值
dft.fillna(method='pad') # 使用缺失值前最后一个有效值进行填
dft.fillna(method='bfill') # 使用缺失值后第一个有效值往回填充