【问题标题】: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的。

标签: python pandas dataframe time-series


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-02
      • 2016-12-11
      • 2019-10-05
      • 2020-03-30
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 2020-11-13
      相关资源
      最近更新 更多