我有一个数据框
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_Red
或C_Blue
或C_Green
中的任何值出现在IN_1
或IN_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] )
但是还不能完全解决
答案 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()]