pandas笔记 基础/groupby/concat/merge/join

备注

本文只是笔记,详细信息可以阅读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列表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值