【问题标题】:How to df.groupby(cols).apply(my_func) for some columns, while leave a few columns not tackled?如何对某些列进行 df.groupby(cols).apply(my_func) 处理,同时保留一些未处理的列?
【发布时间】:2012-10-17 22:32:38
【问题描述】:

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

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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      相关资源
      最近更新 更多