ow*_*ise 4 python numpy sum dataframe pandas
在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
Run Code Online (Sandbox Code Playgroud)
我想要一个名为"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
Run Code Online (Sandbox Code Playgroud)
我发现了以下内容:
df['my_sum'] = df.groupby('ID')['W_1','W_1','W_1'].transform(sum,axis=1)
Run Code Online (Sandbox Code Playgroud)
但这总结了W_1的所有条目.该文件提到的轴parmeter,但我不知道为什么它不是有效的.
保持不变的是.sum(1).以下是已发布的答案的一些创造性替代方案.
df.select_dtypesdf['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
Run Code Online (Sandbox Code Playgroud)
df.ilocdf['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
Run Code Online (Sandbox Code Playgroud)
这是令人讨厌的利用您的数据.
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
或者直接尝试在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
Run Code Online (Sandbox Code Playgroud)