在 pandas 中使用带有零的多索引重采样会导致 NaN
Using multindex resample in pandas with zeros results in NaN
我有一个看起来像这样的数据框...
name datetime value
1 Michael 2012-01-11 01:11:19 3999
3 Janus 2014-01-11 00:01:10 1
4 Janus 2014-01-11 01:12:29 81
5 Janus 2014-01-11 01:11:19 8047
... ... ... ...
9001230 Excalibur1 2014-12-25 01:11:10 1
9001231 Excalibur1 2014-12-25 02:11:10 2
9001232 Excalibur1 2013-12-25 03:11:10 3
9001233 Excalibur1 2014-12-25 04:11:10 4
9001234 Excalibur1 2014-12-25 05:11:10 907
我想找出每个名字每天的总价值是多少。
在没有列出值的日子里,我希望这些日子仍然存在,我想填零。
我可以执行以下操作,但有时似乎只有零填充:
df.set_index(["datetime"]).groupby("name").resample("D")["value"].sum()
name datetime
Michael 2012-01-11 3999
Janus 2014-01-11 8129
2014-10-12 0
2014-10-13 0
2014-10-14 0
...
Excalibur1 2014-12-21 0
2014-12-22 1
2014-12-23 0
2014-12-24 0
2014-12-25 917
为什么/有时/用零填充?将其矩形化的正确方法是什么,所以我对所有日期求和并在不存在记录的地方用零填充?
更新
我想要的索引由...
组成
index=pd.MultiIndex.from_product([
pd.date_range(
df["datetime"].dt.date.min(),
df["datetime"].dt.date.max(), freq="D"),
sorted(df["name"].unique()
)
而且密集。
不要resample
,而是使用groupby
中的日期:
df['datetime'] = pd.to_datetime(df['datetime'])
df.groupby(['name', df['datetime'].dt.date]).sum()
或者,使用 pandas.Grouper
以获得灵活性:
df.groupby(['name', pd.Grouper(key='datetime', freq='D')]).sum()
输出:
value
name datetime
Excalibur1 2013-12-25 3
2014-12-25 914
Janus 2014-01-11 8129
Michael 2012-01-11 3999
矩形和缺失日期:
对于矩形使用:
df2 = df.groupby(['name', pd.Grouper(key='datetime', freq='D')])['value'].sum().unstack(level='name', fill_value=0)
输出:
name Excalibur1 Janus Michael
datetime
2013-12-25 3 0 0
2014-12-25 914 0 0
2014-01-11 0 8129 0
2012-01-11 0 0 3999
并添加缺失的日期,reindex
:
df2 = df.groupby(['name', pd.Grouper(key='datetime', freq='D')])['value'].sum().unstack(level='name', fill_value=0)
df2 = df2.reindex(pd.date_range(df['datetime'].dt.date.min(), df['datetime'].max()), fill_value=0)
输出:
name Excalibur1 Janus Michael
2012-01-11 0 0 3999
2012-01-12 0 0 0
2012-01-13 0 0 0
2012-01-14 0 0 0
2012-01-15 0 0 0
...
我有一个看起来像这样的数据框...
name datetime value
1 Michael 2012-01-11 01:11:19 3999
3 Janus 2014-01-11 00:01:10 1
4 Janus 2014-01-11 01:12:29 81
5 Janus 2014-01-11 01:11:19 8047
... ... ... ...
9001230 Excalibur1 2014-12-25 01:11:10 1
9001231 Excalibur1 2014-12-25 02:11:10 2
9001232 Excalibur1 2013-12-25 03:11:10 3
9001233 Excalibur1 2014-12-25 04:11:10 4
9001234 Excalibur1 2014-12-25 05:11:10 907
我想找出每个名字每天的总价值是多少。
在没有列出值的日子里,我希望这些日子仍然存在,我想填零。
我可以执行以下操作,但有时似乎只有零填充:
df.set_index(["datetime"]).groupby("name").resample("D")["value"].sum()
name datetime
Michael 2012-01-11 3999
Janus 2014-01-11 8129
2014-10-12 0
2014-10-13 0
2014-10-14 0
...
Excalibur1 2014-12-21 0
2014-12-22 1
2014-12-23 0
2014-12-24 0
2014-12-25 917
为什么/有时/用零填充?将其矩形化的正确方法是什么,所以我对所有日期求和并在不存在记录的地方用零填充?
更新
我想要的索引由...
组成index=pd.MultiIndex.from_product([
pd.date_range(
df["datetime"].dt.date.min(),
df["datetime"].dt.date.max(), freq="D"),
sorted(df["name"].unique()
)
而且密集。
不要resample
,而是使用groupby
中的日期:
df['datetime'] = pd.to_datetime(df['datetime'])
df.groupby(['name', df['datetime'].dt.date]).sum()
或者,使用 pandas.Grouper
以获得灵活性:
df.groupby(['name', pd.Grouper(key='datetime', freq='D')]).sum()
输出:
value
name datetime
Excalibur1 2013-12-25 3
2014-12-25 914
Janus 2014-01-11 8129
Michael 2012-01-11 3999
矩形和缺失日期:
对于矩形使用:
df2 = df.groupby(['name', pd.Grouper(key='datetime', freq='D')])['value'].sum().unstack(level='name', fill_value=0)
输出:
name Excalibur1 Janus Michael
datetime
2013-12-25 3 0 0
2014-12-25 914 0 0
2014-01-11 0 8129 0
2012-01-11 0 0 3999
并添加缺失的日期,reindex
:
df2 = df.groupby(['name', pd.Grouper(key='datetime', freq='D')])['value'].sum().unstack(level='name', fill_value=0)
df2 = df2.reindex(pd.date_range(df['datetime'].dt.date.min(), df['datetime'].max()), fill_value=0)
输出:
name Excalibur1 Janus Michael
2012-01-11 0 0 3999
2012-01-12 0 0 0
2012-01-13 0 0 0
2012-01-14 0 0 0
2012-01-15 0 0 0
...