如何为某些列设置df.groupby(cols).apply(my_func),同时留下几个未处理的列?

时间:2012-10-28 09:10:25

标签: python pandas

假设我有一个Pandas数据帧df有列a,b,c,d ... z。我想:df.groupby('a').apply(my_func())d-z,同时保持列'b' & 'c'不变。怎么做?

我注意到Pandas可以通过传递dict将不同的功能应用于不同的列。但我有一个很长的列列表,只是想要设置或提示参数只是告诉Pandas绕过一些列并将my_func()应用于其余列? (否则我必须建立一个长词)

1 个答案:

答案 0 :(得分:4)

一种简单(通用)方法是使用您感兴趣的子集创建数据框的视图(或者,根据您的情况说明,除了您要忽略的列之外的所有列的视图),然后使用申请该视图。

In [116]: df
Out[116]: 
     a  b         c  d        f
0  one  3  0.493808  a      bob
1  two  8  0.150585  b    alice
2  one  6  0.641816  c  michael
3  two  5  0.935653  d      joe
4  one  1  0.521159  e     kate

使用您喜欢的方法创建所需的视图。您可以选择一系列列,例如df_view = df.ix[:,'b':'d'],但以下内容对您的方案可能更有用:

#I want all columns except two 
cols = df.columns.tolist()    
mycols = [x for x in cols if not x in ['a','f']]
df_view = df[mycols]

将您的功能应用于该视图。 (注意这在df中没有任何改变。)

In [158]: df_view.apply(lambda x: x /2)
Out[158]: 
   b         c   d
0  1  0.246904  20
1  4  0.075293  25
2  3  0.320908  28
3  2  0.467827  28
4  0  0.260579  24

使用update()

更新df
In [156]: df.update(df_view.apply(lambda x: x/2))

In [157]: df
Out[157]: 
     a  b         c   d        f
0  one  1  0.246904  20      bob
1  two  4  0.075293  25    alice
2  one  3  0.320908  28  michael
3  two  2  0.467827  28      joe
4  one  0  0.260579  24     kate