选择两个数据框列之一作为新列的输入

时间:2018-11-05 05:45:55

标签: python pandas

我有一个数据帧(df),其头部看起来像:

             DATE   BBG  FLAG  DATE_DIFF   NEW_DATE    
0      2014-03-04  1333     1      -31.0 2014-04-03 
1      2014-04-04  1333     0      -91.0 2014-04-04 
2      2014-07-04  1333     1      -31.0 2014-04-07 
3      2014-08-04  1333     1      -31.0 2014-04-08 
4      2014-09-04  1333     1      -30.0 2014-04-09 
5      2014-10-04  1333     1      -31.0 2014-04-10 
6      2014-11-04  1333     1      204.0 2014-04-11
7      2014-04-14  1333     0       -1.0 2014-04-14 
8      2014-04-15  1333     0       -1.0 2014-04-15 
9      2014-04-16  1333     0       -1.0 2014-04-16 

我正在尝试创建一个名为PICKED的新列,该列根据以下内容从DATENEW_DATE列中选择一个日期:

如果FLAG = 1是有效日期,则选择NEW_DATE,否则选择DATE。

预期输出如下:

NEW_DATE

我正在尝试使用以下方法来实现这一目标:

             DATE   BBG   FLAG  DATE_DIFF   NEW_DATE     PICKED
0      2014-03-04  1333      1      -31.0 2014-04-03 2014-04-03
1      2014-04-04  1333      0      -91.0 2014-04-04 2014-04-04
2      2014-07-04  1333      1      -31.0 2014-04-07 2014-04-07
3      2014-08-04  1333      1      -31.0 2014-04-08 2014-04-08
4      2014-09-04  1333      1      -30.0 2014-04-09 2014-04-09
5      2014-10-04  1333      1      -31.0 2014-04-10 2014-04-10
6      2014-11-04  1333      1      204.0 2014-04-11 2014-04-11
7      2014-04-14  1333      0       -1.0 2014-04-14 2014-04-14
8      2014-04-15  1333      0       -1.0 2014-04-15 2014-04-15
9      2014-04-16  1333      0       -1.0 2014-04-16 2014-04-16

但是我得到以下信息:

df['PICKED'] = np.where(df['FLAG'] == 1, df.NEW_DATE.fillna(df.DATE, inplace=True), df['DATE'])

请让我知道我做错了什么地方。

谢谢

1 个答案:

答案 0 :(得分:1)

您几乎在那里。使用-

df['PICKED'] = np.where(df['FLAG'] == 1, df.NEW_DATE.fillna(df.DATE), df['DATE'])

输出

    DATE    BBG FLAG    DATE_DIFF   NEW_DATE    PICKED
0   2014-03-04  1333    1   -31.0   2014-04-03  2014-04-03
1   2014-04-04  1333    0   -91.0   2014-04-04  2014-04-04
2   2014-07-04  1333    1   -31.0   2014-04-07  2014-04-07
3   2014-08-04  1333    1   -31.0   2014-04-08  2014-04-08
4   2014-09-04  1333    1   -30.0   2014-04-09  2014-04-09
5   2014-10-04  1333    1   -31.0   2014-04-10  2014-04-10
6   2014-11-04  1333    1   204.0   2014-04-11  2014-04-11
7   2014-04-14  1333    0   -1.0    2014-04-14  2014-04-14
8   2014-04-15  1333    0   -1.0    2014-04-15  2014-04-15
9   2014-04-16  1333    0   -1.0    2014-04-16  2014-04-16

说明

使用inplace参数直接修改df。如果您像以前一样使用fillna(),然后直接在df.NEW_DATE

中使用np.where(),那就太好了

但是,您使用fillna()的方式需要将某些内容返回给np.where。指定inplace=True返回None,但直接修改df

在这种情况下,很明显,您需要为np.where()参数返回内容,因此删除inplace=True(默认为inplace=False)即可满足您的需求。