Python 填写分组 ID 的缺失日期,其中每个 ID 都有自己的最小和最大日期
Python Fill in missing dates for grouped IDs, where each ID has it's own min and max date
嘿,我看到很多问题的答案都是最大和最小日期在输出中保持不变。但是如何为每个 ID 填写日期,您只需要在每个 ID 的最大和最小日期之间填写什么。
例如说这是数据框
x = pandas.DataFrame({'user': ['a','a','b','b','a' ], 'dt': ['2016-01-01','2016-01-02', '2016-01-05','2016-01-09','2016-01-06'], 'val': [1,33,2,1,2]})
期望的输出是
日期
用户
值
2016-01-01
一个
1.0
2016-01-02
一个
33.0
2016-01-03
一个
0.0
2016-01-04
一个
0.0
2016-01-05
一个
0.0
2016-01-06
一个
2.0
2016-01-05
b
2.0
2016-01-06
b
0.0
2016-01-07
b
0.0
2016-01-08
b
0.0
2016-01-09
b
1.0
目前正在使用此代码
udates=x['dt'].unique()
x['dt'] = pandas.to_datetime(x['dt'])
filled_df = (x.set_index('dt')
.groupby('user')
.apply(lambda d: d.reindex(pd.date_range(min(x.dt),
max(x.dt),
freq='D')))
.drop('user', axis=1)
.reset_index('user')
.fillna(0))
B 的当前输出回填日期早于其最小日期
日期
用户
值
2016-01-01
一个
1.0
2016-01-02
一个
33.0
2016-01-03
一个
0.0
2016-01-04
一个
0.0
2016-01-05
一个
0.0
2016-01-06
一个
2.0
2016-01-01
b
0.0
2016-01-02
b
0.0
2016-01-03
b
0.0
2016-01-04
b
0.0
2016-01-05
b
2.0
2016-01-06
b
0.0
2016-01-07
b
0.0
2016-01-08
b
0.0
2016-01-09
b
1.0
非常感谢帮助!!!
基于您的解决方案,我只是将 min(x.dt)
替换为 min(d.index)
:
import pandas as pd
x = pd.DataFrame({'user': ['a','a','b','b','a'], 'dt': ['2016-01-01','2016-01-02', '2016-01-05','2016-01-09','2016-01-06'], 'val': [1,33,2,1,2]})
x['dt'] = pd.to_datetime(x['dt'])
filled_df = (x.set_index('dt')
.groupby('user')
.apply(lambda d: d.reindex(pd.date_range(min(d.index),
max(x.dt),
freq='D')))
.drop('user', axis=1)
.reset_index('user')
.fillna(0))
输出
>>> filled_df
user val
2016-01-01 a 1.0
2016-01-02 a 33.0
2016-01-03 a 0.0
2016-01-04 a 0.0
2016-01-05 a 0.0
2016-01-06 a 2.0
2016-01-07 a 0.0
2016-01-08 a 0.0
2016-01-09 a 0.0
2016-01-05 b 2.0
2016-01-06 b 0.0
2016-01-07 b 0.0
2016-01-08 b 0.0
2016-01-09 b 1.0
嘿,我看到很多问题的答案都是最大和最小日期在输出中保持不变。但是如何为每个 ID 填写日期,您只需要在每个 ID 的最大和最小日期之间填写什么。 例如说这是数据框
x = pandas.DataFrame({'user': ['a','a','b','b','a' ], 'dt': ['2016-01-01','2016-01-02', '2016-01-05','2016-01-09','2016-01-06'], 'val': [1,33,2,1,2]})
期望的输出是
日期 | 用户 | 值 |
---|---|---|
2016-01-01 | 一个 | 1.0 |
2016-01-02 | 一个 | 33.0 |
2016-01-03 | 一个 | 0.0 |
2016-01-04 | 一个 | 0.0 |
2016-01-05 | 一个 | 0.0 |
2016-01-06 | 一个 | 2.0 |
2016-01-05 | b | 2.0 |
2016-01-06 | b | 0.0 |
2016-01-07 | b | 0.0 |
2016-01-08 | b | 0.0 |
2016-01-09 | b | 1.0 |
目前正在使用此代码
udates=x['dt'].unique()
x['dt'] = pandas.to_datetime(x['dt'])
filled_df = (x.set_index('dt')
.groupby('user')
.apply(lambda d: d.reindex(pd.date_range(min(x.dt),
max(x.dt),
freq='D')))
.drop('user', axis=1)
.reset_index('user')
.fillna(0))
B 的当前输出回填日期早于其最小日期
日期 | 用户 | 值 |
---|---|---|
2016-01-01 | 一个 | 1.0 |
2016-01-02 | 一个 | 33.0 |
2016-01-03 | 一个 | 0.0 |
2016-01-04 | 一个 | 0.0 |
2016-01-05 | 一个 | 0.0 |
2016-01-06 | 一个 | 2.0 |
2016-01-01 | b | 0.0 |
2016-01-02 | b | 0.0 |
2016-01-03 | b | 0.0 |
2016-01-04 | b | 0.0 |
2016-01-05 | b | 2.0 |
2016-01-06 | b | 0.0 |
2016-01-07 | b | 0.0 |
2016-01-08 | b | 0.0 |
2016-01-09 | b | 1.0 |
非常感谢帮助!!!
基于您的解决方案,我只是将 min(x.dt)
替换为 min(d.index)
:
import pandas as pd
x = pd.DataFrame({'user': ['a','a','b','b','a'], 'dt': ['2016-01-01','2016-01-02', '2016-01-05','2016-01-09','2016-01-06'], 'val': [1,33,2,1,2]})
x['dt'] = pd.to_datetime(x['dt'])
filled_df = (x.set_index('dt')
.groupby('user')
.apply(lambda d: d.reindex(pd.date_range(min(d.index),
max(x.dt),
freq='D')))
.drop('user', axis=1)
.reset_index('user')
.fillna(0))
输出
>>> filled_df
user val
2016-01-01 a 1.0
2016-01-02 a 33.0
2016-01-03 a 0.0
2016-01-04 a 0.0
2016-01-05 a 0.0
2016-01-06 a 2.0
2016-01-07 a 0.0
2016-01-08 a 0.0
2016-01-09 a 0.0
2016-01-05 b 2.0
2016-01-06 b 0.0
2016-01-07 b 0.0
2016-01-08 b 0.0
2016-01-09 b 1.0