在DataFrame中按行对给定列进行求和

3

我有一个由以下定义的DataFrame:

df = pd.DataFrame({
    'id':[1,2,3], 
    'activity':['A1', 'A2', 'A2'], 
    'prep_hours':[None,None,1], 
    'delivery_hours':[10,10,15]})

我想创建一个名为total_hours的列,它是匹配模式*_hours的所有列之和。
目前,我只需将所需列添加到新列中即可。
df.fillna(0, inplace=True)
df['total_hours'] = df['prep_hours'] + df['delivery_hours']

但是它不易扩展。举例来说,我只有两列名为*_hours的数据,但在真实的DataFrame中,它包含超过30个需要添加的列。

有没有更聪明的方法来处理呢?

2个回答

4

使用 DataFrame.filter 函数并带上 like 参数和 sum 函数,无需将缺失的值转换为 0

df["total_hours"] = df.filter(like='_hours').sum(axis=1)
print (df)
   id activity  prep_hours  delivery_hours  total_hours
0   1       A1         NaN              10         10.0
1   2       A2         NaN              10         10.0
2   3       A2         1.0              15         16.0

1
您可以使用列表推导式选择原始数据框的子集,并像这样水平添加内容:
columns = [col for col in df.columns if "_hours" in col]
df["total_hours"] = df[columns].sum(axis=1)

如果你要查找的模式更加复杂,你也可以使用正则表达式匹配 :)

1
谢谢你的回答。我选择了另一个答案,因为:1.它更简短,而且@jezrael在你之前回答了。不过,我真的很喜欢你的答案,因为它在其他情境下似乎更加“可重用”。 - E. Jaep
没关系!非常感谢您抽出时间进行评论。 - Dominique Paul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接