【问题标题】:fill value in a pandas groupby object after filling missing date填充缺失日期后填充熊猫 groupby 对象中的值
【发布时间】:2019-10-22 07:27:27
【问题描述】:

已经问过很多类似的类似问题,这对我有很大帮助,我遵循了以下帮助: Fill in missing dates of groupbyPandas- adding missing dates to DataFrame while keeping column/index values?

但是它仍然没有成功。

我制作了一个玩具数据集来演示我面临的问题:

data = pd.DataFrame({'Date': ['2012-01-01', '2012-01-01','2012-01-01','2012-01-02','2012-01-02','2012-01-02','2012-01-03'], 'Id': ['21','21','22','21','22','23','21'], 'Quantity': ['5','1','4','4','2','1','4'], 'NetAmount': ['66','45','76','35','76','73','45']})

data['Quantity'] = data['Quantity'].astype('int')
data['NetAmount'] = data['NetAmount'].astype('float')

我对数据集进行了分组,如下代码所示:

data['Date'] =pd.to_datetime(data.Date) - pd.to_timedelta(7,unit = 'd')

data =data.groupby(['Id',pd.Grouper(key='Date', freq='W-MON')])['Quantity', 'NetAmount'].sum().reset_index().sort_values('Date')
data.reset_index()
data1 = data.groupby(['Id','Date']).agg({'Quantity': sum, 'NetAmount': sum}).reset_index()

然后我填写缺失的日期:

data2 = data1.set_index(['Date', 'Id','NetAmount']).Quantity.unstack(-3).\
    reindex(columns=pd.date_range(data1['Date'].min(), data1['Date'].max(),freq='W-MON'),fill_value=0).\
            stack(dropna=False).unstack().stack(dropna=False).\
                unstack('NetAmount').stack(dropna=False).fillna(0).reset_index()

给出结果数据框:

   Id    level_1  NetAmount     0
0   21 2011-12-26       45.0   0.0
1   21 2011-12-26       73.0   0.0
2   21 2011-12-26      146.0  10.0
3   21 2011-12-26      152.0   0.0
4   21 2012-01-02       45.0   4.0
5   21 2012-01-02       73.0   0.0
6   21 2012-01-02      146.0   0.0
7   21 2012-01-02      152.0   0.0
8   22 2011-12-26       45.0   0.0
9   22 2011-12-26       73.0   0.0
10  22 2011-12-26      146.0   0.0
11  22 2011-12-26      152.0   6.0
12  22 2012-01-02       45.0   0.0
13  22 2012-01-02       73.0   0.0
14  22 2012-01-02      146.0   0.0
15  22 2012-01-02      152.0   0.0
16  23 2011-12-26       45.0   0.0
17  23 2011-12-26       73.0   1.0
18  23 2011-12-26      146.0   0.0
19  23 2011-12-26      152.0   0.0
20  23 2012-01-02       45.0   0.0
21  23 2012-01-02       73.0   0.0
22  23 2012-01-02      146.0   0.0
23  23 2012-01-02      152.0   0.0

但实际上我希望得到:

0   21 2011-12-26       66.0   5.0
1   21 2011-12-26       45.0   1.0
2   21 2011-12-26       35.0   4.0
3   21 2012-02-02       45.0   4.0
4   22 2011-12-26       76.0   4.0
5   22 2012-02-02       76.0   2.0
6   23 2011-12-26        0.0   0.0
7   23 2012-02-02       73.0   1.0

填充有效,但是,我不明白结果数据框中到底发生了什么,例如 netAmount 列中的结果是关闭的 我是 unstack/stack 函数的新手,我是否在过程中遗漏了什么?感谢您的帮助!

更新:添加“0”值后,我尝试按 id 和数据重新分组:

data2 = pd.DataFrame(data2)
data3 = data2.groupby(['Id','Date']).agg({'Quantity': sum, 'NetAmount': sum}).reset_index()

但我收到此错误

Traceback (most recent call last):
  File "", line 48, in <module>
    data3 = data2.groupby(['Id','Date']).agg({'Quantity': sum, 'NetAmount': sum}).reset_index()
  File "", line 7632, in groupby
    observed=observed, **kwargs)
  File "", line 2110, in groupby
    return klass(obj, by, **kwds)
  File "", line 360, in __init__
    mutated=self.mutated)
  File "", line 578, in _get_grouper
    raise KeyError(gpr)
KeyError: 'Date'

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您需要将您的列 QuantityNetAmount 转换为数字

    data['Quantity'] = data['Quantity'].astype('int')
    data['NetAmount'] = data['NetAmount'].astype('float')
    

    当列是字符串时,sum 函数按组连接所有字符串。

    现在重新运行您的代码,它应该可以按预期工作

    #   Id  level_1   NetAmount 0
    #0  21  2011-12-26  45.0    0.0  
    #1  21  2011-12-26  73.0    0.0
    #2  21  2011-12-26  146.0   10.0
    #3  21  2011-12-26  152.0   0.0
    #4  21  2012-01-02  45.0    4.0
    #5  21  2012-01-02  73.0    0.0
    #6  21  2012-01-02  146.0   0.0
    #7  21  2012-01-02  152.0   0.0
    #8  22  2011-12-26  45.0    0.0
    #9  22  2011-12-26  73.0    0.0
    #10 22  2011-12-26  146.0   0.0
    #11 22  2011-12-26  152.0   6.0
    #12 22  2012-01-02  45.0    0.0
    #13 22  2012-01-02  73.0    0.0
    #14 22  2012-01-02  146.0   0.0
    #15 22  2012-01-02  152.0   0.0
    #16 23  2011-12-26  45.0    0.0
    #17 23  2011-12-26  73.0    1.0
    #18 23  2011-12-26  146.0   0.0
    #19 23  2011-12-26  152.0   0.0
    #20 23  2012-01-02  45.0    0.0
    #21 23  2012-01-02  73.0    0.0
    #22 23  2012-01-02  146.0   0.0
    #23 23  2012-01-02  152.0   0.0
    

    【讨论】:

    • 它至少摆脱了 Nan 值!但它仍然不起作用。不可能得到那些大答案,我应该得到大部分 0,如果数量为 0,则 netAmount 也应该为 0,因为它们都是 fill_values(0) 的结果
    • 当我运行代码时我得到的大多是零,我不再有那些大值了,你是在pd.DataFrame(...) 之后和data['Date']=... 之前添加代码吗?
    • 我在代码末尾添加了数据框data2,您能告诉我哪些行是错误的吗?
    • 我有,您是否在 NetAmount 列中也得到 0?我将在我的问题中包含一个预期的结果数据框
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 2018-01-01
    相关资源
    最近更新 更多