在pandas数据框中分组后,有没有办法对列进行求和?例如,我有以下数据框:
ID W_1 W_2 W_3
1 0.1 0.2 0.3
1 0.2 0.4 0.5
2 0.3 0.3 0.2
2 0.1 0.3 0.4
2 0.2 0.0 0.5
1 0.5 0.3 0.2
1 0.4 0.2 0.1
我希望有一个名为“my_sum”的额外列,它将所有列中的第一行(W_1,W_2,W_3)相加。输出将是这样的:
ID W_1 W_2 W_3 my_sum
1 0.1 0.2 0.3 0.6
1 0.2 0.4 0.5 1.1
2 0.3 0.3 0.2 0.8
2 0.1 0.3 0.4 0.8
2 0.2 0.0 0.5 0.7
1 0.5 0.3 0.2 1.0
1 0.4 0.2 0.1 0.7
我发现了以下内容:
df['my_sum'] = df.groupby('ID')['W_1','W_1','W_1'].transform(sum,axis=1)
但是这总结了W_1的所有条目。 documentation提到轴公差,但我不确定它为什么没有效果。
答案 0 :(得分:8)
保持不变的是.sum(1)
。以下是已经发布的答案的一些创造性替代方案。
df.select_dtypes
df['my_sum'] = df.select_dtypes(float).sum(1)
df
ID W_1 W_2 W_3 my_sum
0 1 0.1 0.2 0.3 0.6
1 1 0.2 0.4 0.5 1.1
2 2 0.3 0.3 0.2 0.8
3 2 0.1 0.3 0.4 0.8
4 2 0.2 0.0 0.5 0.7
5 1 0.5 0.3 0.2 1.0
6 1 0.4 0.2 0.1 0.7
df.iloc
df['my_sum'] = df.iloc[:, 1:].sum(1)
df
ID W_1 W_2 W_3 my_sum
0 1 0.1 0.2 0.3 0.6
1 1 0.2 0.4 0.5 1.1
2 2 0.3 0.3 0.2 0.8
3 2 0.1 0.3 0.4 0.8
4 2 0.2 0.0 0.5 0.7
5 1 0.5 0.3 0.2 1.0
6 1 0.4 0.2 0.1 0.7
这令人讨厌地利用了您的数据。
df['my_sum'] = df[df < 1].sum(1)
df
ID W_1 W_2 W_3 my_sum
0 1 0.1 0.2 0.3 0.6
1 1 0.2 0.4 0.5 1.1
2 2 0.3 0.3 0.2 0.8
3 2 0.1 0.3 0.4 0.8
4 2 0.2 0.0 0.5 0.7
5 1 0.5 0.3 0.2 1.0
6 1 0.4 0.2 0.1 0.7
DataFrame.sum
或numpy.sum
使用str.contains
:
df.iloc[:, df.columns.str.contains('W_')].sum(1)
df
ID W_1 W_2 W_3 my_sum
0 1 0.1 0.2 0.3 0.6
1 1 0.2 0.4 0.5 1.1
2 2 0.3 0.3 0.2 0.8
3 2 0.1 0.3 0.4 0.8
4 2 0.2 0.0 0.5 0.7
5 1 0.5 0.3 0.2 1.0
6 1 0.4 0.2 0.1 0.7
或者直接尝试在numpy数组上求和,以获得性能:
df['my_sum'] = df.values[:, 1:].sum(1)
df
ID W_1 W_2 W_3 my_sum
0 1 0.1 0.2 0.3 0.6
1 1 0.2 0.4 0.5 1.1
2 2 0.3 0.3 0.2 0.8
3 2 0.1 0.3 0.4 0.8
4 2 0.2 0.0 0.5 0.7
5 1 0.5 0.3 0.2 1.0
6 1 0.4 0.2 0.1 0.7
答案 1 :(得分:4)
In [7]: df['my_sum'] = df.drop('ID',1).sum(axis=1)
In [8]: df
Out[8]:
ID W_1 W_2 W_3 my_sum
0 1 0.1 0.2 0.3 0.6
1 1 0.2 0.4 0.5 1.1
2 2 0.3 0.3 0.2 0.8
3 2 0.1 0.3 0.4 0.8
4 2 0.2 0.0 0.5 0.7
5 1 0.5 0.3 0.2 1.0
6 1 0.4 0.2 0.1 0.7
或:
In [9]: df['my_sum'] = df.filter(regex='^W_\d+').sum(axis=1)
In [10]: df
Out[10]:
ID W_1 W_2 W_3 my_sum
0 1 0.1 0.2 0.3 0.6
1 1 0.2 0.4 0.5 1.1
2 2 0.3 0.3 0.2 0.8
3 2 0.1 0.3 0.4 0.8
4 2 0.2 0.0 0.5 0.7
5 1 0.5 0.3 0.2 1.0
6 1 0.4 0.2 0.1 0.7
答案 2 :(得分:4)
如果您只想跨行汇总,则不需要按任何内容进行分组。只需在总和中使用axis=1
。
关键是要弄清楚如何识别要汇总的列。在您的情况下,我们可以通过多种方式选择适当的列。我们实际上并不知道你的真实情况是什么&#34;数据看起来像。
@MaxU涵盖了更实用的解决方案。这个应该很快。
df.assign(
my_sum=np.column_stack([df[c].values for c in df if c.startswith('W_')]).sum(1)
)
ID W_1 W_2 W_3 my_sum
0 1 0.1 0.2 0.3 0.6
1 1 0.2 0.4 0.5 1.1
2 2 0.3 0.3 0.2 0.8
3 2 0.1 0.3 0.4 0.8
4 2 0.2 0.0 0.5 0.7
5 1 0.5 0.3 0.2 1.0
6 1 0.4 0.2 0.1 0.7
或者它真的只是['W_1', 'W_2', 'W_3']
df.assign(my_sum=df[['W_1', 'W_2', 'W_3']].sum(1))
ID W_1 W_2 W_3 my_sum
0 1 0.1 0.2 0.3 0.6
1 1 0.2 0.4 0.5 1.1
2 2 0.3 0.3 0.2 0.8
3 2 0.1 0.3 0.4 0.8
4 2 0.2 0.0 0.5 0.7
5 1 0.5 0.3 0.2 1.0
6 1 0.4 0.2 0.1 0.7
答案 3 :(得分:0)
此外,您可以将列表传递到数据框,以指示要累加的列。这很有用,因为列可以很容易地以列表形式放置。
mm-popup