【问题标题】:Sum values in df column based on partial name of another column根据另一列的部分名称对 df 列中的值求和
【发布时间】:2018-09-09 01:48:34
【问题描述】:

给定数据框

a       b
foo123  5
foo456  8
bar234  1
bar324  6

如何仅根据 a 的前几个字符添加 b 中的值?我正在寻找的输出是:

a    b
foo  13
bar  7

a 列的条目太多无法手动设置,因此以下内容将不起作用:

if df['a'].startswith('foo'):
    sum(b)

我的想法更像是如果df['a'] 的前三个字符匹配,则为b 添加所有相应的行。

【问题讨论】:

    标签: python regex pandas dataframe


    【解决方案1】:

    如果您的子字符串的长度不同,请使用str.extract,从a 中提取相关部分,然后使用它对b 执行groupby + sum 操作:

    # assuming your frame is df1
    df1.groupby(df1['a'].str.extract(r'^(\D+)', expand=False))['b'].sum().reset_index()
    
         a   b
    0  bar   7
    1  foo  13
    

    为了提高性能,请先预分配a

    df1['a'] = df1['a'].str.extract(r'^(\D+)', expand=False)
    df1.groupby('a', as_index=False)['b'].sum()
    
         a   b
    0  bar   7
    1  foo  13
    

    如果所有子字符串的大小相同,只需切片和groupby

    df1.groupby(df1['a'].str[:3])['b'].sum().reset_index()
    
         a   b
    0  bar   7
    1  foo  13
    

    【讨论】:

    • 使用 df.a.str.extract(r'^(\D+)'... 只会给我 a 列的前两个字母。使用df.groupby(df.a.str[:3])... 会给我错误AttributeError: 'function' object has no attribute 'str'。我应该给出一个更好的样本 df,我的实际 df 有完整的列名(例如 samplecounts),所以这可能是错误的根源? (我正在将您的示例中的 ab 更改为 samplecounts。)
    • @Liquidity 嗯,使用df['sample'] 因为sample 是一种数据框方法,所以你不能在那里使用. 访问器。此外,“前两个字母”是您在原始问题中提出问题的方式的结果。如果您有任何其他问题,您真的应该让您的minimal reproducible example 反映这些问题。
    • 也是我的错,说我的df 实际上被称为df1。在哪里用df1 替换df?我尝试了很多组合,但似乎有些地方你只留下通用的df 而我找不到它们。
    • @Liquidity 我已经编辑了我的答案,我希望现在情况更清楚了。没有什么叫做“通用”df,这只是用于命名数据​​框变量的约定。
    • @COLDSPEED 使用任一选项都有效,但会将我的整个 sample 列变为 NaN。有任何想法吗?感谢您更新您的原始答案,这对我的理解有很大帮助。 :)
    【解决方案2】:

    replace 编号为 ''

    df.groupby(df.a.str.replace('\d+', '')).b.sum()
    Out[1353]: 
    a
    bar     7
    foo    13
    Name: b, dtype: int64
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      • 2016-01-16
      • 2020-12-29
      • 1970-01-01
      • 2019-11-02
      • 1970-01-01
      相关资源
      最近更新 更多