【问题标题】:How to apply different functions to different columns on pandas dataframe如何将不同的功能应用于熊猫数据框上的不同列
【发布时间】:2017-04-03 11:58:24
【问题描述】:

我想在 pandas 数据框上使用 groupby,但我想获得某些列的平均值和其他列的总和。假设我们有以下数据框:

ID   A    B    C
1    1    1    0
1    2    3    1
1    3    6    1
4    3    2    1
4    4    1    0
6    5    1    0
6    6    6    1
6    7    2    0

我想按 ID 分组并获得“A”列的平均值和其他列的总和(实际上我有 40 多列)。

我希望结果如下所示:

ID   A    B    C
1    2    10   2
4    3.5  3    1
6    6    9    1

提前致谢。

【问题讨论】:

    标签: python pandas numpy dataframe


    【解决方案1】:

    你可以这样做:

    数据:

    In [127]: df = pd.DataFrame(np.random.randint(0,10, (7,6)), columns=list('ABCDEF'))
         ...: df['ID'] = np.random.choice([1,2], len(df))
         ...:
    
    In [128]: df
    Out[128]:
       A  B  C  D  E  F  ID
    0  7  7  2  2  3  0   1
    1  8  4  1  3  6  8   1
    2  4  7  7  2  8  4   2
    3  5  9  3  6  6  1   1
    4  4  6  1  7  4  6   2
    5  4  5  3  8  7  6   2
    6  8  4  1  8  1  0   1
    

    解决方案:

    In [129]: fnc = {c:'sum' for c in df.columns.drop(['ID','A'])}
         ...: fnc['A'] = 'mean'
         ...:
    
    In [130]: fnc
    Out[130]: {'A': 'mean', 'B': 'sum', 'C': 'sum', 'D': 'sum', 'E': 'sum', 'F': 'sum'}
    
    In [131]: df.groupby('ID').agg(fnc).reindex_axis(df.columns.drop('ID'), 1)
    Out[131]:
        A   B   C   D   E   F
    ID
    1   7  24   7  19  16   9
    2   4  18  11  17  19  16
    

    【讨论】:

    • 真的有必要使用.tolist()吗?你可以迭代 Index 对象就好了,不是吗?
    • 作为进一步的补充,您可以在OrderedDict 中传递这些函数,以便在生成的DF 中保留列的顺序。
    • @NickilMaveli,谢谢你的提示!我已经使用.reindex_axis() 方法修复了它...
    猜你喜欢
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 2017-03-28
    相关资源
    最近更新 更多