问题1:
我有一个包含两个月值列的数据框,分别为month1
和month2
。如果month1
列中的值不是NA
,则按照amount
列求和相应的month1
值。如果month1
列中的值是NA
,则选择“ month2”的对应值并在month1
列中搜索并执行求和。
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]
}
)
问题1的期望输出:
month1 month2 sum_amount
0 1.0 NaN 60
1 2.0 5.0 20
2 NaN 1.0 60
3 1.0 2.0 60
4 4.0 NaN 60
5 NaN 1.0 60
6 NaN 3.0 0
问题2:
我有一个包含两个月值列的数据框,分别为
month1
和month2
。如果month1
列中的值不是NA
,则按照amount
列求和相应的month2
值。如果month1
列中的值为NA
,则选择相应的month2
值并在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]
}
)
问题2的期望输出:
month1 month2 sum_amount
0 1.0 NaN 110
1 2.0 5.0 50
2 NaN 1.0 110
3 1.0 2.0 110
4 4.0 NaN 0
5 NaN 1.0 110
6 NaN 3.0 100
最佳答案
首先将字符串NA
替换为缺少的值,然后将sum
聚合为Series
。然后将Series.map
用于缺少不匹配值的新列,因此用NaN
和映射的另一列替换Series.fillna
,最后将两列中的不匹配值替换为0
:
df = df.replace('NA', np.nan)
s = df.groupby('month1')['amount'].sum()
df['sum_amount'] = df['month1'].map(s).fillna(df['month2'].map(s)).fillna(0).astype(int)
print (df)
month1 month2 amount sum_amount
0 1.0 NaN 10 60
1 2.0 5.0 20 20
2 NaN 1.0 40 60
3 1.0 2.0 50 60
4 4.0 NaN 60 60
5 NaN 1.0 70 60
6 NaN 3.0 100 0
并且第二次只更改相同解决方案中的列名称:
df = df.replace('NA', np.nan)
s = df.groupby('month2')['amount'].sum()
df['sum_amount'] = df['month1'].map(s).fillna(df['month2'].map(s)).fillna(0).astype(int)
print (df)
month1 month2 amount sum_amount
0 1.0 NaN 10 110
1 2.0 5.0 20 50
2 NaN 1.0 40 110
3 1.0 2.0 50 110
4 4.0 NaN 60 0
5 NaN 1.0 70 110
6 NaN 3.0 100 100
关于python - 应用多个条件级别分组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57520736/