我有一个包含两个月值列的数据框,分别为“ 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
输出数据框
答案 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指出的那样,您的数据可能是数字和字符串的混合,因此在进行处理之前将它们全部转换为数字。
一种简单的方法是分别将groupby
和transform
的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