【问题标题】:Fill rows with consecutive values and above rows using pandas使用 pandas 填充具有连续值和以上行的行
【发布时间】:2019-09-18 12:34:41
【问题描述】:

我有一个这样的数据框:

df

col1    col2
 1        A 
 3        B
 6        A
 10       C

我想从 df 上方创建一个数据框,如果 col1 值不连续,它将使用下一个 col1 值创建另一行,而 col2 值将是上面的值。

我要找的数据框应该是

df
col1    col2
 1        A
 2        A
 3        B
 4        B
 5        B
 6        A
 7        A
 8        A
 9        A
 10       C

我可以使用一个简单的 for 循环来做到这一点,但是有没有任何 python 方法可以最有效地使用 pandas 来做到这一点?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    这是使用set_index()reindexffill 的一种方法:

    df.set_index('col1').reindex(range(df.col1.min(),df.col1.max()+1)).ffill().reset_index()
    
    #df.set_index('col1').reindex(range(df.col1.min(),df.col1.max()+1),method='ffill')\
                                                         #.reset_index()
    

       col1 col2
    0     1    A
    1     2    A
    2     3    B
    3     4    B
    4     5    B
    5     6    A
    6     7    A
    7     8    A
    8     9    A
    9    10    C
    

    【讨论】:

    • 谢谢,但是如果col1包含日期怎么办(col1值的类型是numpy.datetime64),如何生成两者之间的日期?
    • @KallolSamanta 然后看看resampleasfreqdf.set_index('col1').asfreq('D',method='ffill') 可能是或df.set_index('col1').resample('D').ffill()
    【解决方案2】:

    一种方法是使用reindexffill

    (df.set_index('col1')
       .reindex(range(df.col1.iloc[0], df.col1.iloc[-1]+1))
       .ffill()
       .reset_index())
    
        col1 col2
    0     1    A
    1     2    A
    2     3    B
    3     4    B
    4     5    B
    5     6    A
    6     7    A
    7     8    A
    8     9    A
    9    10    C
    

    或者使用Series.repeat的其他方式:

    df.col2.repeat(df.col1.diff().shift(-1).fillna().reset_index(drop=True)
    

    【讨论】:

    • 谢谢,但是如果col1包含日期怎么办(col1值的类型是numpy.datetime64),如何生成两者之间的日期?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 2018-03-14
    • 1970-01-01
    • 2010-12-30
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多