【问题标题】:Sum the duplicate rows of particular columns in dataframe对数据框中特定列的重复行求和
【发布时间】:2018-11-05 12:11:55
【问题描述】:

我想根据 B 列的重复行添加特定的列(C、D、E、F、G)。而其余的非重复行保持不变。 A 列的输出必须是重复行的第一个索引。

我有一个如下的数据框:

A     B     C  D  E  F  G
box1  0487  1     1     1
box2  0487     1     1
blue  0478  1  1        1
gray  0478  1  1  1  1
gray  0478        1  1  1
flat  8704  1  1        1
clay  8704        1     1
dark  8740  1  1  1  1  1
late  4087  1     1     1

我希望输出如下:

A     B     C   D  E  F  G
box1  0487  1   1  1  1  1
blue  0478  2   2  2  2  2
flat  8704  1   1  1     2
dark  8740  1   1  1  1  1
late  4087  1      1     1

我很高兴听到一些建议。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    使用聚合函数创建列名字典并传递给agg,这里也需要min_count=1sum 以避免0 总和NaNs 值:

    L = ['C','D','E','F','G']
    d = {**dict.fromkeys(L, lambda x: x.sum(min_count=1)), **{'A':'first'}}
    df = df.groupby('B', as_index=False, sort=False).agg(d).reindex(columns=df.columns)
    print (df)
          A     B    C    D    E    F    G
    0  box1  0487  1.0  1.0  1.0  1.0  1.0
    1  blue  0478  2.0  2.0  2.0  2.0  2.0
    2  flat  8704  1.0  1.0  1.0  NaN  2.0
    3  dark  8740  1.0  1.0  1.0  1.0  1.0
    4  late  4087  1.0  NaN  1.0  NaN  1.0
    

    d = {**dict.fromkeys(L, 'sum'), **{'A':'first'}}
    df = df.groupby('B', as_index=False, sort=False).agg(d).reindex(columns=df.columns)
    print (df)
          A     B    C    D    E    F    G
    0  box1  0487  1.0  1.0  1.0  1.0  1.0
    1  blue  0478  2.0  2.0  2.0  2.0  2.0
    2  flat  8704  1.0  1.0  1.0  0.0  2.0
    3  dark  8740  1.0  1.0  1.0  1.0  1.0
    4  late  4087  1.0  0.0  1.0  0.0  1.0
    

    【讨论】:

    • 我有 df.groupby('B').agg( {**{ 'A': lambda x: x.head(1)}, **{i:'sum' for i in df.columns if i!='A'}}) 。我太慢了:-(
    • @RavinderSingh13- 在我看来,没有简单的方法,我喜欢tutorials,尤其是modern pandas
    • 对于 Pandas,他是最伟大的专家,对专业知识和经验的赞誉@jezrael
    • @pygo - 我认为不是,像 jeff、unutbu 和许多其他人这样的 pandas 开发人员更好,但他们没有时间 - 显然创建新版本的 pandas 或使用 pandas github 问题 ;)
    • @Vishali - L = ['C','D','E','F','G'] 中定义的列的必要 dtypes 必须是数字、浮点数或整数。你可以通过print (df[L].dtypes)查看它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 2021-04-12
    • 2017-08-09
    • 1970-01-01
    • 2022-06-20
    • 2019-08-11
    • 1970-01-01
    相关资源
    最近更新 更多