基于条件的新列值

时间:2020-10-21 15:43:54

标签: python pandas dataframe

我有一个这样的数据集。

df = pd.DataFrame({"A" :[1,1,3,4], "B": [1,3,2,2]})

如果A = 1&B =(1,3),我想创建一个类型为1的C的新列 我使用了.loc,我的代码是

df.loc[(df['A'] == 1)&(df['B'] == 1), 'C'] = 'type 1'
df.loc[(df['A'] == 1)&(df['B'] == 3), 'C'] = 'type 1'

上面的方法有效,但是当我使用

df.loc[(df['A'] == 1)&(df['B'] == (1,3)), 'C'] = 'type 1'

什么也没有发生,它没有显示错误,列也没有更新。

预期输出是

A   B   C
1   1   type 1
1   3   type 1
3   2   Nan
4   2   Nan

还有其他方法吗?

预先感谢

3 个答案:

答案 0 :(得分:3)

使用numpy.where

In [1517]: import numpy as np
In [1518]: df['C'] = np.where(df.A.eq(1) & df.B.isin([1,3]), 'type 1', np.nan)

In [1519]: df
Out[1519]: 
   A  B       C
0  1  1  type 1
1  1  3  type 1
2  3  2     nan
3  4  2     nan

答案 1 :(得分:1)

其他方法可能是尝试使用类似于.evalanswer here

df.loc[df.eval('A ==1 and B in [1,3]'), 'C']= 'type 1'

如果您想修复已有的代码,可以尝试使用|进行分隔:

df.loc[(df['A'] == 1)&((df['B'] ==1) | (df['B'] ==3)), 'C'] = 'type 1'

答案 2 :(得分:1)

这是一个可能的解决方案,它不使用任何库,而是使用熊猫:

df['C'] = pd.Series(index=range(len(df)), dtype='float')
df['C'][df['A'] == 1 & df['B'].isin((1, 3))] = 'type 1'