On Pandas Dataframes-
我有一个看起来像这样的数据帧:
ID date1 date2 date3
0 NaT NaT 2019-02-28
1 NaT 2019-11-10 2019-04-09
2 NaT NaT 2019-05-21
3 2019-12-06 2019-12-05 2019-12-27
4 2019-11-18 2019-11-18 2019-12-20
我想在数据帧中添加另一个字段以获得如下输出:
ID date1 date2 date3 date4
0 NaT NaT 2019-02-28 2019-02-28
1 NaT 2019-11-10 2019-04-09 2019-11-10
2 NaT NaT 2019-05-21 2019-05-21
3 2019-12-06 2019-12-05 2019-12-27 2019-12-06
4 2019-11-18 2019-11-18 2019-12-20 2019-11-18
挨次
如果未填充日期 2 和日期 1,则日期 4 将由日期 3 填充。
如果填充了 date2和 date3,则 date4 将由 date2 填充。
如果填充了日期 1、日期 2 和日期 3,则 date4 将由 date1 填充。
你有一个关于如何实现这一目标的想法吗?
我尝试了fillna
但不是很成功。
使用回填缺失值,然后按位置选择第一列DataFrame.iloc
:
df['date4'] = df[['date1','date2','date3']].bfill(axis=1).iloc[:, 0]
或使用Series.fillna
或Series.combine_first
:
df['date4'] = df['date1'].fillna(df['date2']).fillna(df['date3'])
print (df)
ID date1 date2 date3 date4
0 0 NaT NaT 2019-02-28 2019-02-28
1 1 NaT 2019-11-10 2019-04-09 2019-11-10
2 2 NaT NaT 2019-05-21 2019-05-21
3 3 2019-12-06 2019-12-05 2019-12-27 2019-12-06
4 4 2019-11-18 2019-11-18 2019-12-20 2019-11-18
您可以像这样替换 NaN 值:
df['date4']=np.where(df['date1'].isna(),df['date2'],df['date1'])
df['date4']=np.where(df['date4'].isna(),df['date3'],df['date3'])
有些情况你没有考虑过(比如如果 date1 不是 NaN 但 date2 是(,但这些都可以类似地处理。
我个人会使用循环,以便清楚地了解正在发生的事情,并且更易于维护。下面是一个示例。使用您列出的"date4"条件不会用条目填充所有条件。
# required modules
import pandas as pd
import itertools
# create a data frame
d = {'ID': [0, 1, 2, 3, 4],
'date1': [None, None, None, '2019-12-06', '2019-11-18'],
'date2': [None, '2019-11-10', None, '2019-12-05', '2019-11-18'],
'date3': ['2019-02-28', '2019-04-09', '2019-05-21', '2019-12-27', '2019-12-20']}
dat = pd.DataFrame(d)
# make date4
date4 = []
for index, row in dat.iterrows():
if row['date2'] and row['date1'] == None:
date4.append(row['date3'])
elif row['date2'] and row['date3'] != None:
date4.append(row['date2'])
elif row['date1'] and row['date2'] and row['date3'] != None:
date4.append(row['date1'])
else:
date4.append(None)
# append to df
dat['date4'] = date4