【问题标题】:Pandas - Fill with other column if the field is NaT (Null)Pandas - 如果字段为 NaT (Null),则填写其他列
【发布时间】:2019-12-09 12:20:55
【问题描述】:

关于 Pandas 数据框-

我有一个如下所示的数据框:

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

按顺序,

如果 date2 和 date1 未填充,则 date4 将由 date3 填充。

如果填充了 date2 和 date3,则 date4 将由 date2 填充。

如果填充了 date1、date2 和 date3,则 date4 将由 date1 填充。

您知道如何实现这一目标吗?

我尝试了fillna,但并没有真正成功。

【问题讨论】:

  • 你能用df.to_dict(orient='records')发送你的数据框的dict版本吗

标签: python python-3.x pandas dataframe


【解决方案1】:

使用回填缺失值,然后按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

【讨论】:

  • 我会使用链接,我喜欢 bfill 选项,+1
  • 我喜欢 bfill 选项...谢谢
【解决方案2】:

您可以像这样替换 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 是),但这些都可以类似地处理。

【讨论】:

    【解决方案3】:

    我个人会使用循环,以便清楚发生了什么,并且更易于维护。这是一个例子。将您列出的条件用于“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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      • 2023-03-31
      • 2018-01-06
      • 2016-01-19
      • 1970-01-01
      相关资源
      最近更新 更多