熊猫isin在乘法列

时间:2020-08-06 11:02:08

标签: pandas

我有一个数据框

    IN_1      IN_2     C_Red   C_Blue  C_Green     
0   Blue     Red        0       0        0          
1   Red      Green      0      Blue      Green      
2   Green    Red        0      Blue       0         
3   Red      Blue      Red      0         0         

我想说的是,C_RedC_BlueC_Green中的任何值出现在IN_1IN_2中,然后给出0到我的输出列。

    IN_1      IN_2     C_Red   C_Blue  C_Green     OUTPUT
0   Blue     Red        0       0        0          1
1   Red      Green      0      Blue      Green      0
2   Green    Red        0      Blue       0         1
3   Red      Blue      Red      0         0         0

到目前为止,我已经做到了

df.apply(lambda x: [(c in [C_Red,C_Blue,C_Green]) for c in df.loc[x,[IN_1, IN_2]].values] )

但是还不能完全解决

2 个答案:

答案 0 :(得分:1)

使用set来检查交集,如果为空,则将False的转换输出转换为bool,然后传递给numpy.where

m = df.apply(lambda x: bool(set(x[['IN_1','IN_2']]) & 
                            set(x[['C_Red','C_Blue', 'C_Green']])), axis=1)

使用Series.isin的另一种解决方案:

f = lambda x: x[['IN_1','IN_2']].isin(x[['C_Red','C_Blue', 'C_Green']])
m = df.apply(f, axis=1).any(axis=1)

或具有列表理解功能的解决方案:

zipped = zip(df[['IN_1','IN_2']].values, df[['C_Red','C_Blue', 'C_Green']].values)
m = [bool(set(y) & set(x)) for x, y in zipped]

df['OUTPUT'] = np.where(m, 0, 1)
print (df)
    IN_1   IN_2 C_Red C_Blue C_Green  OUTPUT
0   Blue    Red     0      0       0       1
1    Red  Green     0   Blue   Green       0
2  Green    Red     0   Blue       0       1
3    Red   Blue   Red      0       0       0

答案 1 :(得分:1)

列表理解适用于此处:

in_cols = df.columns[df.columns.str.startswith("IN")]
c_cols = df.columns[df.columns.str.startswith("C")]

df["output"] = [0 if set(val.array).intersection(val1.array) else 1
                for (key, val), (key1, val1)
                in zip(df[in_cols].T.items(), df[c_cols].T.items())
                ]

    IN_1    IN_2    C_Red   C_Blue  C_Green output
0   Blue    Red     0        0         0        1
1   Red     Green   0        Blue      Green    0
2   Green   Red     0        Blue      0        1
3   Red     Blue    Red      0         0        0

如果列是固定的,则可以使用numpy和硬编码值进行迭代:

df['output'] = [0 
                if set(entry[:2]).intersection(entry[2:]) 
                else 1 
                for entry in df.to_numpy()]