Pandas:如何根据其他列的条件对列进行求和?

25

我有以下的pandas DataFrame。

import pandas as pd
df = pd.read_csv('filename.csv')

print(df)

     dog      A         B           C
0     dog1    0.787575  0.159330    0.053095
1     dog10   0.770698  0.169487    0.059815
2     dog11   0.792689  0.152043    0.055268
3     dog12   0.785066  0.160361    0.054573
4     dog13   0.795455  0.150464    0.054081
5     dog14   0.794873  0.150700    0.054426
..    ....
8     dog19   0.811585  0.140207    0.048208
9     dog2    0.797202  0.152033    0.050765
10    dog20   0.801607  0.145137    0.053256
11    dog21   0.792689  0.152043    0.055268
    ....

我通过以下方式将列"A""B""C"相加以创建一个新列:

df['total_ABC'] = df[["A", "B", "B"]].sum(axis=1)

现在我想基于一个条件来执行这个操作,即如果 "A" < 0.78,则创建一个新的求和列 df['smallA_sum'] = df[["A", "B", "B"]].sum(axis=1)。否则,该值应为零。

如何创建类似这样的条件语句?

我的想法是使用

df['smallA_sum'] = df1.apply(lambda row: (row['A']+row['B']+row['C']) if row['A'] < 0.78))

然而,这并不起作用,我无法指定轴。

如何根据其他列的值创建列?

您也可以执行类似于每个df ['dog'] =='dog2',创建列dog2_sum的操作,即:

 df['dog2_sum'] = df1.apply(lambda row: (row['A']+row['B']+row['C']) if df['dog'] == 'dog2'))

但是我的做法不正确。

2个回答

35

以下代码应该可行,在这里我们掩盖了满足条件的数据框,这将会把条件不符合的行设置为NaN,所以我们在新的列上调用fillna

In [67]:
df = pd.DataFrame(np.random.randn(5,3), columns=list('ABC'))
df

Out[67]:
          A         B         C
0  0.197334  0.707852 -0.443475
1 -1.063765 -0.914877  1.585882
2  0.899477  1.064308  1.426789
3 -0.556486 -0.150080 -0.149494
4 -0.035858  0.777523 -0.453747

In [73]:    
df['total'] = df.loc[df['A'] > 0,['A','B']].sum(axis=1)
df['total'].fillna(0, inplace=True)
df

Out[73]:
          A         B         C     total
0  0.197334  0.707852 -0.443475  0.905186
1 -1.063765 -0.914877  1.585882  0.000000
2  0.899477  1.064308  1.426789  1.963785
3 -0.556486 -0.150080 -0.149494  0.000000
4 -0.035858  0.777523 -0.453747  0.000000

另一种方法是在sum结果上调用where函数,它接受一个值参数,在不满足条件时返回该参数:

In [75]:
df['total'] = df[['A','B']].sum(axis=1).where(df['A'] > 0, 0)
df

Out[75]:
          A         B         C     total
0  0.197334  0.707852 -0.443475  0.905186
1 -1.063765 -0.914877  1.585882  0.000000
2  0.899477  1.064308  1.426789  1.963785
3 -0.556486 -0.150080 -0.149494  0.000000
4 -0.035858  0.777523 -0.453747  0.000000

1
另一种方法是使用numpy.where()方法选择值。如果满足条件,则返回从总和结果中选择的元素,否则返回0。由于开销较低,numpy方法通常比它们的pandas表兄弟更快。除了numba-jitted或Cython循环外,这是针对此特定任务的最快方法。
import numpy as np
df['Total'] = np.where(df['A'] < 0.78, df[['A','B','C']].sum(axis=1), 0)

或者

df['total'] = np.where(df['dog'] == 'dog2', df[['A','B','C']].sum(axis=1), 0)

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