我想在我的 df 中创建一个新列,该列的值将映射到来自其他几个列的值。

目前我有这个:

df['PLATFORM'] = df['ID_1'].map(lambda x: 'ID_1_MATCH' if x == 9 else 0)
df['PLATFORM'] = df['ID_2'].map(lambda x: 'ID_2_MATCH' if x == 10 else 0)
df['PLATFORM'] = df['ID_3'].map(lambda x: 'ID_3_MATCH' if x == 11 else 0)

使用这种方法,新列中的值将在第二个和第三个映射上被覆盖(其中 x 与 lambda 表达式的条件匹配)。我只想更新在上一个 map 之后仍然是 0 值的列。

有没有办法以分层方式将值映射到新列中,这取决于其他几个列中的行值?

最佳答案

我认为你需要 numpy.where :

df['PLATFORM'] = np.where(df['ID_1']  == 9, 'ID_1_MATCH',
                 np.where(df['ID_2']  == 10, 'ID_2_MATCH',
                 np.where(df['ID_3']  == 11, 'ID_3_MATCH', 0 )))

样本:
df = pd.DataFrame({'ID_1':[9,2,3,4],
                   'ID_2':[4,10,6,1],
                   'ID_3':[7,8,11,0]})

print (df)
   ID_1  ID_2  ID_3
0     9     4     7
1     2    10     8
2     3     6    11
3     4     1     0

df['PLATFORM'] = np.where(df['ID_1']  == 9, 'ID_1_MATCH',
                 np.where(df['ID_2']  == 10, 'ID_2_MATCH',
                 np.where(df['ID_3']  == 11, 'ID_3_MATCH', 0 )))
print (df)
   ID_1  ID_2  ID_3    PLATFORM
0     9     4     7  ID_1_MATCH
1     2    10     8  ID_2_MATCH
2     3     6    11  ID_3_MATCH
3     4     1     0           0

关于python - 针对多列创建列、行值映射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43073614/

10-12 00:24
查看更多