Python-通过多列聚合组,跳过nan单元格



我正在尝试聚合多列的数据帧,按Date分组。有些细胞含有nan,我想保留它。所以我的df看起来是这样的:

import random
import numpy as np
import pandas as pd
rng = ['2015-02-24','2015-02-24','2015-02-24','2015-02-24','2015-02-24','2015-02-24',
'2015-02-25','2015-02-25','2015-02-25','2015-02-25','2015-02-25','2015-02-25']
rng = pd.to_datetime(rng)
Predicted = [random.randrange(-1, 50, 1) for i in range(12)]
Actual_data = [5,3,8,2,9,20, np.NaN,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN]
Category = ['A','A','A','B','B','B','A','A','A','B','B','B']
df = pd.DataFrame({ 'Date': rng, 'Predicted' : Predicted, 'Actual': Actual_data, 'Category': Category})

df

Date  Predicted  Actual Category
0   2015-02-24         0      5.0        A
1   2015-02-24         36     3.0        A
2   2015-02-24         30     8.0        A
3   2015-02-24         33     2.0        B
4   2015-02-24         49     9.0        B
5   2015-02-24         42    20.0        B
6   2015-02-25         25     NaN        A
7   2015-02-25          9     NaN        A
8   2015-02-25         21     NaN        A
9   2015-02-25         39     NaN        B
10  2015-02-25         17     NaN        B
11  2015-02-25         11     NaN        B

我想通过:Date分组,从而求和PredictedActual,去掉Category。此外,由于我想维护只有NaN的组,所以要保留NaN值,而不是将其转换为0。所以最后我想要这个:

Date  Predicted  Actual 
0   2015-02-24        190      49   
1   2015-02-25        122     NaN  

我试过类似的东西:

df = data.groupby(['Date'])['Predicted', 'Actual'].agg('sum').reset_index()

这看起来很有效,但后来我看到它将NaN转换为0,这是我不想要的。我试着添加skipna=False,但它说不可能添加。我确实更新到了熊猫的最新版本,因为我在某个地方读到这可能是问题所在,但这无关紧要。有人能帮我吗。。?

您可以使用min_count=1,这意味着执行操作需要最少1个有效值:

df.groupby(['Date'])[['Predicted', 'Actual']].sum(min_count=1)

输出

Predicted  Actual
Date                         
2015-02-24        124    47.0
2015-02-25        162     NaN

为什么这有效而skipna=False无效,你可以阅读GitHub上的讨论。

如果任何值不为空,您可以编写一个lambda函数来返回和,否则返回NaN

df.groupby(['Date'])['Predicted', 'Actual'].agg(lambda x: sum(x) if any(x) else np.nan).reset_index()

输出

Date  Predicted  Actual
0 2015-02-24        174    47.0
1 2015-02-25        164     NaN

最新更新