对缺失日期的行重新采样,并在除一列之外的所有列中向前填充值

Pin*_*ts0 4 python conditional date fill pandas

我目前有以下示例数据框:

No  FlNo    DATE        Loc    Type
20  1826    6/1/2017    AAA    O
20  1112    6/4/2017    BBB    O
20  1234    6/6/2017    CCC    O
20  43      6/7/2017    DDD    O
20  1840    6/8/2017    EEE    O
Run Code Online (Sandbox Code Playgroud)

我想在彼此顶部的两行中填写缺失的日期。我还想用顶行中的值填充非日期列的值,但将“类型”列留空以填充行。

请查看所需的输出:

No  FlNo    DATE        Loc    Type 
20  1826    6/1/2017    AAA    O
20  1826    6/2/2017    AAA
20  1826    6/3/2017    AAA
20  1112    6/4/2017    BBB    O
20  1112    6/5/2017    BBB
20  1234    6/6/2017    CCC    O
20  43      6/7/2017    DDD    O
20  1840    6/8/2017    EEE    O
Run Code Online (Sandbox Code Playgroud)

我在 Google 和 stackoverflow 上到处搜索,但没有找到任何日期填写熊猫数据框的答案。

cs9*_*s95 7

首先,使用,转换DATEdatetimepd.to_datetime

df.DATE = pd.to_datetime(df.DATE)
Run Code Online (Sandbox Code Playgroud)

选项 1
使用resample+ ffill,然后稍后重置类型列。首先,将唯一日期存储在某个列表中:

dates = df.DATE.unique()
Run Code Online (Sandbox Code Playgroud)

现在,

df = df.set_index('DATE').resample('1D').ffill().reset_index()
df.Type = df.Type.where(df.DATE.isin(dates), '')
Run Code Online (Sandbox Code Playgroud)

df

        DATE  No  FlNo  Loc Type
0 2017-06-01  20  1826  AAA    O
1 2017-06-02  20  1826  AAA     
2 2017-06-03  20  1826  AAA     
3 2017-06-04  20  1112  BBB    O
4 2017-06-05  20  1112  BBB     
5 2017-06-06  20  1234  CCC    O
6 2017-06-07  20    43  DDD    O
7 2017-06-08  20  1840  EEE    O
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以DATE恢复原状;

df.DATE = df.DATE.dt.strftime('%m/%d/%Y')
Run Code Online (Sandbox Code Playgroud)

选项 2
另一种选择是asfreq+ ffill+ fillna

df = df.set_index('DATE').asfreq('1D').reset_index()
c = df.columns.difference(['Type'])
df[c] = df[c].ffill()
df['Type'] = df['Type'].fillna('')
Run Code Online (Sandbox Code Playgroud)

df
        DATE    No    FlNo  Loc Type
0 2017-06-01  20.0  1826.0  AAA    O
1 2017-06-02  20.0  1826.0  AAA     
2 2017-06-03  20.0  1826.0  AAA     
3 2017-06-04  20.0  1112.0  BBB    O
4 2017-06-05  20.0  1112.0  BBB     
5 2017-06-06  20.0  1234.0  CCC    O
6 2017-06-07  20.0    43.0  DDD    O
7 2017-06-08  20.0  1840.0  EEE    O
Run Code Online (Sandbox Code Playgroud)