问题1:

我有一个包含两个月值列的数据框,分别为month1month2。如果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:

我有一个包含两个月值列的数据框,分别为month1month2。如果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/

10-12 21:32