我正在尝试聚合多列的数据帧,按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
分组,从而求和Predicted
和Actual
,去掉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