重新标记缺少日期的行,并在除一个列之外的所有列中转发填充值

时间:2018-03-29 21:36:33

标签: python pandas date conditional fill

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

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

我想在彼此的顶部填写两行的缺失日期。我还要用顶行中的值填写非日期列的值但是请输入' Type'填充行的列空白。

请参阅所需的输出:

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

我搜索了Google和stackoverflow,但没有找到任何日期填写pandas数据帧的答案。

1 个答案:

答案 0 :(得分:1)

首先,使用DATEdatetime转换为pd.to_datetime列,

df.DATE = pd.to_datetime(df.DATE)

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

dates = df.DATE.unique()

现在,

df = df.set_index('DATE').resample('1D').ffill().reset_index()
df.Type = df.Type.where(df.DATE.isin(dates), '')

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

如果需要,您可以将DATE恢复到原始状态;

df.DATE = df.DATE.dt.strftime('%m/%d/%Y')

选项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('')

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