对所有列中缺失日期和前向填充值的行重新采样,但一列除外
Resample rows for missing dates and forward fill values in all columns except one
我目前有以下示例数据框:
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 和 Whosebug,但没有找到 pandas 数据框的任何日期填写答案。
首先,使用 pd.to_datetime
、
将 DATE
转换为 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
我目前有以下示例数据框:
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 和 Whosebug,但没有找到 pandas 数据框的任何日期填写答案。
首先,使用 pd.to_datetime
、
DATE
转换为 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