备注
本文只是笔记,详细信息可以阅读pandas官方文档:
http://pandas.pydata.org/pandas-docs/stable/cookbook.html
http://pandas.pydata.org/pandas-docs/stable/merging.html
基本操作
if-then-else
对指定特征值满足某些条件的行的某些特征值进行处理
loc,作为左值:
df.loc[df.AAA >= 5,['BBB','CCC']] = 555;
where:
df_mask = pd.DataFrame({'AAA' : [True] * 4, 'BBB' : [False] * 4,'CCC' : [True,False] * 2})
df.where(df_mask,-1000)
numpy:
df['logic'] = np.where(df['AAA'] > 5,'high','low');
分割,split
选取满足条件的行组成新的dataframe
dflow = df[df.AAA <= 5];
逻辑操作:
dflow = df[(df.AAA>4) & (df.BBB>25)]
或者使用下面等方式进行逻辑操作:
Crit1 = df.AAA <= 5.5
Crit2 = df.BBB == 10.0
AllCrit = Crit1 & Crit2 或者用reduce函数:CritList = [Crit1,Crit2,Crit3]; AllCrit = functools.reduce(lambda x,y: x & y, CritList)
dflow = df[AllCrit]
df.loc,按照AAA进行分组,选取BBB的最小值对应的那一行
df.loc[df.groupby("AAA")["BBB"].idxmin()]
选取特定条件的列:
切片选取,df[[‘aaa’,’ccc’]]或者df[[0,3]]
loc,作为右值:
newseries = df.loc[(df['BBB'] < 25) & (df['CCC'] >= -40), 'AAA']
argsort:
df.loc[(df.CCC.abs().argsort()]
选择行
- 使用上面分割部分说的方法
- df.loc[‘bar’:’kar’],使用label,包含结束,或者df.ix[‘bar’:’kar’]
- df.iloc[0:3], 使用index,不包含结束,或者df.ix[0:3]
- df[~((df.AAA <= 6) & (df.index.isin([0,2,4])))],~代表所有逻辑语句以及逻辑符号都取反,所以结果是AAA>6 | df.index不为0,2,4
选取行和列
df.ix[:, :]
或者使用df.loc[:, :], df.iloc[:, :]
loc/iloc/ix
- loc使用的是标签进行索引
- iloc使用行号进行索引
- ix可以同时用和行号或者标签
panel
相当于好几个df合起来:pf = pd.Panel({‘df1’:df1,’df2’:df2,’df3’:df3})
增加列
增加一列,右边可以使用不同的逻辑替换
df['logic'] = np.where(df['AAA'] > 5,'high','low');
使用applymap增加几列,即对source_cols的每一列使用categories进行映射
source_cols = df.columns
new_cols = [str(x) + "_cat" for x in source_cols]
categories = {1 : 'Alpha', 2 : 'Beta', 3 : 'Charlie' }
df[new_cols] = df[source_cols].applymap(categories.get)
排序
df.sort_values(by=('AAA', 'BBB'), ascending=False)
缺失值处理
df.reindex(df.index[::-1]).ffill()
groupby
按照animal分组,并只输出animal和size列,且选取weight最大值对应的行:
df.groupby('animal').apply(lambda subf: subf['size'][subf['weight'].idxmax()])
按照animal分组,animal不作为index,并且输出第一个组的所有列:
df.groupby('animal',as_index=False).first()
get_group获取组:
gb = df.groupby(['animal'])
gb.get_group('cat')
apply
group对象执行function,实参为每一个组:
def function(x):
pass
gb.apply(function)
transform
def replace(g):
mask = g < 0
g.loc[mask] = g[~mask].mean()
return g
gb.transform(replace)
分组累加求和
data['sum_Times']=data['Times'].groupby(['userID']).cumsum()
合并
concat
result = pd.concat([df1, df4], axis=1),axis默认为0,代表按行合并,为1代表按列合并
result = pd.concat([df1, df4], axis=1, join=’inner’),不加join参数代表全连接,inner代表内连接
result = pd.concat([df1, df4], axis=1, join_axes=[df1.index]), join_axes参数代表只采用df1的index
append
df1.append(df2),不改变df1的值
concat和append都可以使用ignore_index=True,忽略index
merge
- pd.merge(left, right, how=’inner’, on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=(‘_x’, ‘_y’), copy=True, indicator=False,
validate=None) result = pd.merge(left, right, on=[‘key1’, ‘key2’])
result = pd.merge(left, right, how=’left’, on=[‘key1’, ‘key2’])
result = pd.merge(left, right, how=’right’, on=[‘key1’, ‘key2’])
result = pd.merge(left, right, how=’outer’, on=[‘key1’, ‘key2’])
result = pd.merge(left, right, how=’inner’, on=[‘key1’, ‘key2’]),结果和不加how一样,inner是how的默认值
- result = pd.merge(left, right, on=’B’, how=’outer’)
join
- result = left.join(right, on=’key’),没有on的话默认以index为标准进行对齐
而如果用merge来实现,需要用:result = pd.merge(left, right, left_on=’key’, right_index=True,how=’left’, sort=False)
* result = left.join([right, right2]),可以合并多个表
其他
df.index,获取label列表