熊猫 - 如果字段为 NaT(空),则用其他列填充



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.fillnaSeries.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

最新更新