【问题标题】:Python - aggregate groupby multiple columns, skipping nan cellsPython - 聚合 groupby 多列,跳过 nan 单元格
【发布时间】:2022-08-18 21:42:20
【问题描述】:

我正在尝试跨多个列聚合一个数据框,按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,但它说无法添加它。当我在某处读到这可能是问题时,我确实更新到了最新版本的熊猫,但这没关系。有人可以帮我吗..?

    标签: python pandas group-by aggregate nan


    【解决方案1】:

    您可以使用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 上的讨论。

    【讨论】:

    • 我也看到了这个,但是有些值实际上可能是 0(我需要包括这些值,例如,如果某一天所有 Predicted 都是 0,我希望总和为 0,而不是将其转换为 NaN?或者不它不是这样工作的吗?
    • 这仍然有效。 min_count 表示:执行操作所需的有效值数量。
    • 啊,现在我明白了,非常感谢,我理解错了所以我没有尝试,谢谢你的解释:)
    【解决方案2】:

    也许您可以编写一个 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
    

    【讨论】:

    • 这完美无缺,谢谢:D!
    猜你喜欢
    • 2021-11-01
    • 2019-10-12
    • 1970-01-01
    • 2014-11-23
    • 2017-07-19
    • 2017-08-27
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多