应用条件分组

时间:2019-08-15 17:51:02

标签: python pandas

我有一个包含两个月值列的数据框,分别为“ month1”和“ month2”。如果“ month1”列中的值不是“ NA”,则按照“ month1”列中的相应“金额”值求和。如果“ month1”列中的值为“ NA”,则将“ month2”列中相应的“金额”值相加。

import pandas as pd
df = pd.DataFrame({'month1': [1,2,'NA', 1, 4, 'NA', 'NA'],
          'month2': ['NA',5,1, 2, 'NA', 1, 3],
          'amount': [10,20,40, 50, 60, 70, 100]})

输入和输出数据帧如下:

输入数据框

   month1  month2  amount
0     1.0     NaN      10
1     2.0     5.0      20
2     NaN     1.0      40
3     1.0     2.0      50
4     4.0     NaN      60
5     NaN     1.0      70
6     NaN     3.0     100

输出数据框

3 个答案:

答案 0 :(得分:1)

由于您的chkdsk /f值是字符串,因此只需在两列上NA

groupby

如果您不想更改数据,则可以

# ignore month2 if month1 is NA
df.loc[df.month1.ne('NA'), 'month2'] = 'NA'

# groupby and sum
df.groupby(['month1','month2']).amount.transform('sum')

输出:

s = np.where(df.month1.ne('NA'), 'NA', df['month2'])

df.groupby(['month1', s]).amount.transform('sum')

答案 1 :(得分:1)

您可以使用:

c=df.month1.eq('NA')
np.select([c,~c],[df.groupby('month2')['amount'].transform('sum')
     ,df.groupby('month1')['amount'].transform('sum')],default='NA') #assign to new column

array(['60', '20', '110', '60', '60', '110', '100'], dtype='<U21')

答案 2 :(得分:1)

编辑:正如@rafael指出的那样,您的数据可能是数字和字符串的混合,因此在进行处理之前将它们全部转换为数字。

一种简单的方法是分别将groupbytransform的month1和month2以及fillna的结果乘以month2

df = df.apply(pd.to_numeric, errors='coerce')
m1 = df.groupby('month1').amount.transform('sum')
m2 = df.groupby('month2').amount.transform('sum')

m1.fillna(m2)

Out[406]:
0    60.0
1    20.0
2    110.0
3    60.0
4    60.0
5    110.0
6    100.0
Name: amount, dtype: float64