在数据框中添加列

时间:2018-08-09 16:19:14

标签: python pandas dataframe

我有一个包含3个变量(id,V1,V2)的数据框,我想根据变量V1和V2创建另一个变量,将其称为V3,并将采用2种方式(“ LISTED”和“ UN_LISTED” )。这是我的数据框:

print(df)
   id             V1       V2
0   1            NaN      NaN
1   2       QSINTSTK      NaN
2   3  1111GHGKJKIUH  122354H
3   4        FGHKLIH  123456K
4   5         FDUL12  237899M
5   6        VHKIOY3  784236A
6   7            NaN      Nan

这是创建V3的条件:

如果V1和V2为空,则为“ UN_LISTED”

如果V2不为null,则为“ LISTED”

如果V1以“ QS”或“ 1111”开头,则为“ UN_LISTED”,否则为“ LISTED”。

这是我的代码:

def label_list (row):
if row['V1'] == np.NaN and row['V2'] == np.NaN:
    return 'UN_LISTED'

elif row['V2'] != np.NaN:
    return 'LISTED'

elif row['V1'] == "^QS" or row['V1'] == "^(1){4}" :
    return 'UN_LISTED'

else : 
    return "LISTED"

datatest.apply(lambda row : label_list(row), axis = 1)
datatest['V3'] = datatest.apply(lambda row : label_list(row), axis = 1)

但是结果是错误的:

print(df)
   id             V1       V2     V3 
0   1            NaN      NaN  LISTED
1   2       QSINTSTK      NaN  LISTED
2   3  1111GHGKJKIUH  122354H  LISTED
3   4        FGHKLIH  123456K  LISTED
4   5         FDUL12  237899M  LISTED
5   6        VHKIOY3  784236A  LISTED
6   7            NaN      Nan  LISTED

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

有关以下解决方案的说明:

您的要求中有重叠的条件,例如,V2可能不为空,而V1也可能以QS1111开头(发生在第3行中),因此您需要按照要优先考虑这些条件的顺序来设置np.select

使用np.select

c1 = df.V1.isnull() & df.V2.isnull()
c2 = df.V2.notnull()
c3 = df.V1.str.contains(r'^QS|^1111').fillna(False)

df.assign(V3=np.select([c1, c2, c3], ['UNLISTED', 'LISTED', 'UNLISTED'], 'LISTED'))

输出:

   id             V1       V2        V3
0   1            NaN      NaN  UNLISTED
1   2       QSINTSTK      NaN  UNLISTED
2   3  1111GHGKJKIUH  122354H    LISTED
3   4        FGHKLIH  123456K    LISTED
4   5         FDUL12  237899M    LISTED
5   6        VHKIOY3  784236A    LISTED
6   7            NaN      NaN  UNLISTED