Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫在DataFrame中填写缺失的每月日期,用零填充一个特定列_Python_Pandas_Dataframe - Fatal编程技术网

Python 熊猫在DataFrame中填写缺失的每月日期,用零填充一个特定列

Python 熊猫在DataFrame中填写缺失的每月日期,用零填充一个特定列,python,pandas,dataframe,Python,Pandas,Dataframe,我面临一个关于熊猫的问题,以及如何在数据框中填充缺失的日期。 给定数据帧的结构如下所示: Amount Code Type Date 0 34.97 J36J 74343 2016-01-01 1 16.32 J36J 74343 2016-04-01 2 10.30 J36J 69927 2015-12-01 3 10.45 J36J 69927 2016-07-01 4 5.63 J3

我面临一个关于熊猫的问题,以及如何在数据框中填充缺失的日期。 给定数据帧的结构如下所示:

     Amount  Code     Type   Date
0     34.97  J36J     74343 2016-01-01
1     16.32  J36J     74343 2016-04-01
2     10.30  J36J     69927 2015-12-01
3     10.45  J36J     69927 2016-07-01
4      5.63  J36J     69927 2017-03-01
5     15.79  J36J     69927 2018-09-01
6     15.00  J36J     69927 2019-06-01
7      6.44  J36J     69926 2016-03-01
8      6.47  J36J     69926 2017-03-01
9     15.00  J36J     69926 2018-07-01
10    15.00  J36J     69926 2019-06-01
  • 额:额
  • 代码:在整个数据帧中相同的Productcode
  • 类型:一个Producttype,有许多不同的类型
  • 日期:日期范围,跨越2015年12月至 2020年9月
我的目标是每月为每个类型输入一个时间跨度。 也就是说,每种材料都应该有58个条目。 “人工”创建的每月分录的金额应为0。 因此,我的预期输出是(例如,仅针对一种类型)

幸运的是,已经有人提出了同样的问题 ()

我根据我的情况修改了非常有用的答案:

df.Date=pd.to_datetime(df.Date)
s=pd.date_range(df.Date.min(),df.Date.max(),freq='MS')

df=df.set_index(['Code','Type','Date']).\
      Amount.unstack().reindex(columns=s,fill_value=0).stack().reset_index()
df
这工作得很好,但后来我检查了生成的数据帧,似乎有一些日期丢失了

398     74343  J36J 2016-01-01  34.97
399     74343  J36J 2016-02-01   0.00
400     74343  J36J 2016-04-01  16.32
401     74343  J36J 2016-05-01   0.00
402     74343  J36J 2016-06-01   0.00
403     74343  J36J 2016-08-01   0.00
404     74343  J36J 2016-10-01   0.00
405     74343  J36J 2016-11-01   0.00
406     74343  J36J 2016-12-01   0.00
你们知道这是什么原因吗? 我想可能是因为我选择的频率('MS')?但我认为其他人都不适合。()还是必须手动设置数据范围? 在我的初始数据框中,显然不是所有日期都可用

在那件事上的任何帮助都是感激的


BR

这是一个微妙的过程,非常有趣

import pandas as pd
data = {'Amount' :[34.97, 16.32, 10.3, 10.45, 5.63, 15.79, 15, 6.44, 6.47, 15, 15],
'Code': ['J36J','J36J','J36J','J36J','J36J','J36J','J36J','J36J','J36J','J36J','J36J'],
'Type': [74343,74343,69927,69927,9927,69927,69927,69926,69926,69926,69926],
'Date': ['1/1/2016','4/1/2016','12/1/2015','7/1/2016','3/1/2017','9/1/2018','6/1/2019','3/1/2016','3/1/2017','7/1/2018','6/1/2019']}
df = pd.DataFrame(data)
df['Date'] = pd.to_datetime(df['Date'], format='%m/%d/%Y')
df
这得到了上述值的起点。然后我们花了一段时间才弄清楚到底发生了什么,问题是我们对所有类型使用了相同的s,而不是单独使用。因此,如果日期是另一种类型,则不会被覆盖

为了解决这个问题,我把它分成几部分,这样我们就可以把它重新组装起来

outdf = pd.DataFrame(columns = df.columns)
s=pd.date_range(df.Date.min(),df.Date.max(),freq='MS')
for name, subdf in df.groupby('Type'):
    thisdf=subdf.set_index(['Code','Type','Date']).\
        Amount.unstack().reindex(columns=s,fill_value=0).stack().reset_index()
    thisdf.rename(columns={0: "Amount", "level_2": "Date"}, errors="raise",inplace=True)
    thisdf.reset_index(inplace=True)
    thisdf = thisdf[['Code', 'Type', 'Date', 'Amount']]
    outdf = pd.concat([outdf,thisdf])
    outdf = outdf[['Code', 'Type', 'Date', 'Amount']]

outdf.reset_index(inplace=True)
outdf = outdf[['Code', 'Type', 'Date', 'Amount']]

因此,我们所做的是将其分解成单独的项目,然后在每次通过groupby后将它们粘在一起。这样我们就不会错过其他类型的日期了。

哇,这是夏洛克下一级的作品,非常感谢!这就是为什么我如此喜欢StackOverflow,你总是能学到新东西。
outdf = pd.DataFrame(columns = df.columns)
s=pd.date_range(df.Date.min(),df.Date.max(),freq='MS')
for name, subdf in df.groupby('Type'):
    thisdf=subdf.set_index(['Code','Type','Date']).\
        Amount.unstack().reindex(columns=s,fill_value=0).stack().reset_index()
    thisdf.rename(columns={0: "Amount", "level_2": "Date"}, errors="raise",inplace=True)
    thisdf.reset_index(inplace=True)
    thisdf = thisdf[['Code', 'Type', 'Date', 'Amount']]
    outdf = pd.concat([outdf,thisdf])
    outdf = outdf[['Code', 'Type', 'Date', 'Amount']]

outdf.reset_index(inplace=True)
outdf = outdf[['Code', 'Type', 'Date', 'Amount']]