我有一个包含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
感谢您的帮助
答案 0 :(得分:1)
有关以下解决方案的说明:
您的要求中有重叠的条件,例如,V2
可能不为空,而V1
也可能以QS
或1111
开头(发生在第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