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月
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']]