如何将连续行填充到熊猫数据框?

Posted

技术标签:

【中文标题】如何将连续行填充到熊猫数据框?【英文标题】:How to fill continuous rows to panda dataframe? 【发布时间】:2020-10-02 09:06:29 【问题描述】:

我有一个如下所示的数据框:

    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)

这没有什么不同。

【问题讨论】:

我感觉你的value不全是1的。 【参考方案1】:

尝试旋转然后堆叠:

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

【讨论】:

【参考方案2】:

我们可以先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

【讨论】:

非常感谢,我这样做了,行已正确扩展,但如何将插入的值设置为 0? s=df.pivot(*df.columns).fillba(0).stack().to_frame('value').reset_index() @heisthere【参考方案3】:

如果你的数据(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

【讨论】:

以上是关于如何将连续行填充到熊猫数据框?的主要内容,如果未能解决你的问题,请参考以下文章

添加一列,这是熊猫中连续行差异的结果

如何在熊猫中用空列表[]填充数据框Nan值?

如何从 for 循环构建和填充熊猫数据框? [复制]

从多个字典填充熊猫数据框

如何在熊猫数据框中仅填充选定列的空值? [复制]

如何根据来自dfB的列/行值,用来自另一个数据框(dfB)的值填充熊猫数据框(dfA)列“ A”?