我有一个看起来像这样的数据框:
name date value
0 a 2020-01-01 1
1 a 2020-01-03 1
2 a 2020-01-05 1
3 b 2020-01-02 1
4 b 2020-01-03 1
5 b 2020-01-04 1
6 b 2020-01-05 1
其中的值由value_df = df.groupby(['name', 'date'], as_index=False).value.sum()
如何做到以下几点:
name date value
0 a 2020-01-01 1
1 a 2020-01-02 1
2 a 2020-01-03 1
3 a 2020-01-04 1
4 a 2020-01-05 1
5 b 2020-01-01 1
6 b 2020-01-02 1
7 b 2020-01-03 1
8 b 2020-01-04 1
9 b 2020-01-05 1
我尝试了
date_index = pd.date_range(start=min(df['date']), end=max(df['date']))
value_df['value'] = pd.Series(value_df['value'])
value_df.reindex(date_index)
没有什么不同。
答案 0 :(得分:5)
尝试旋转然后堆叠:
date_index = pd.date_range(start=df['date'].min(), end=df['date'].max())
(df.pivot_table('value','name','date',fill_value=1)
.reindex(date_index,axis=1).reset_index().melt('name',var_name='date'))
或者:
(df.pivot_table('value','name','date',fill_value=1)
.reindex(date_index,axis=1).stack().reset_index(name='value'))
name date value
0 a 2020-01-01 1
1 a 2020-01-02 1
2 a 2020-01-03 1
3 a 2020-01-04 1
4 a 2020-01-05 1
5 b 2020-01-01 1
6 b 2020-01-02 1
7 b 2020-01-03 1
8 b 2020-01-04 1
9 b 2020-01-05 1
答案 1 :(得分:3)
我们可以先做pivot
然后做stack
s=df.pivot(*df.columns).ffill().bfill().stack().to_frame('value').reset_index()
Out[199]:
name date value
0 a 2020-01-01 1.0
1 a 2020-01-02 1.0
2 a 2020-01-03 1.0
3 a 2020-01-04 1.0
4 a 2020-01-05 1.0
5 b 2020-01-01 1.0
6 b 2020-01-02 1.0
7 b 2020-01-03 1.0
8 b 2020-01-04 1.0
9 b 2020-01-05 1.0
答案 2 :(得分:1)
如果您的数据(value
)并非全部1
,则可以执行ffill
,bfill
:
(df.set_index(['date','name'])
.unstack().reindex(date_index)
.ffill().bfill()
.stack()
.reset_index()
)
输出:
date name value
0 2020-01-01 a 1.0
1 2020-01-01 b 1.0
2 2020-01-02 a 1.0
3 2020-01-02 b 1.0
4 2020-01-03 a 1.0
5 2020-01-03 b 1.0
6 2020-01-04 a 1.0
7 2020-01-04 b 1.0
8 2020-01-05 a 1.0
9 2020-01-05 b 1.0