我在熊猫中有以下数据帧
target A B C
0 cat bridge cat brush
1 brush dog cat shoe
2 bridge cat shoe bridge
Run Code Online (Sandbox Code Playgroud)
如何测试是否df.target在任何列中['A','B','C', etc.],哪些列要检查?
我已经尝试将A,B和C合并到一个字符串中使用,df.abcstring.str.contains(df.target)但这不起作用.
drop该target列有一个DF与你A,B,C仅列isin目标列的值是否为any存在命中而已.
df["exists"] = df.drop("target", 1).isin(df["target"]).any(1)
print(df)
target A B C exists
0 cat bridge cat brush True
1 brush dog cat shoe False
2 bridge cat shoe bridge True
Run Code Online (Sandbox Code Playgroud)
OneHotEncoder 方法:
In [165]: x = pd.get_dummies(df.drop('target',1), prefix='', prefix_sep='')
In [166]: x
Out[166]:
bridge cat dog cat shoe bridge brush shoe
0 1 0 0 1 0 0 1 0
1 0 0 1 1 0 0 0 1
2 0 1 0 0 1 1 0 0
In [167]: x[df['target']].eq(1).any(1)
Out[167]:
0 True
1 True
2 True
dtype: bool
Run Code Online (Sandbox Code Playgroud)
解释:
In [168]: x[df['target']]
Out[168]:
cat cat brush bridge bridge
0 0 1 1 1 0
1 0 1 0 0 0
2 1 0 0 0 1
Run Code Online (Sandbox Code Playgroud)
另一种使用指数差法的方法:
matches = df[df.columns.difference(['target'])].eq(df['target'], axis = 0)
# A B C
#0 False True False
#1 False False False
#2 False False True
# Check if at least one match:
matches.any(axis = 1)
#Out[30]:
#0 True
#1 False
#2 True
Run Code Online (Sandbox Code Playgroud)
如果您想查看哪些列满足目标,这里是一个可能的解决方案:
matches.apply(lambda x: ", ".join(x.index[np.where(x.tolist())]), axis = 1)
Out[53]:
0 B
1
2 C
dtype: object
Run Code Online (Sandbox Code Playgroud)
mask = df.eq(df.pop('target'), axis=0)
print (mask)
A B C
0 False True False
1 False False False
2 False False True
Run Code Online (Sandbox Code Playgroud)
然后如果需要检查至少一项True添加any:
mask = df.eq(df.pop('target'), axis=0).any(axis=1)
print (mask)
0 True
1 False
2 True
dtype: bool
df['new'] = df.eq(df.pop('target'), axis=0).any(axis=1)
print (df)
A B C new
0 bridge cat brush True
1 dog cat shoe False
2 cat shoe bridge True
Run Code Online (Sandbox Code Playgroud)
但如果需要检查列中的所有值,请使用isin:
mask = df.isin(df.pop('target').values.tolist())
print (mask)
A B C
0 True True True
1 False True False
2 True False True
Run Code Online (Sandbox Code Playgroud)
如果要检查所有值是否都已True添加all:
df['new'] = df.isin(df.pop('target').values.tolist()).all(axis=1)
print (df)
A B C new
0 bridge cat brush True
1 dog cat shoe False
2 cat shoe bridge False
Run Code Online (Sandbox Code Playgroud)