我有以下pandas.DataFrame
:
df = pd.DataFrame({'A1':['a','a','d'], 'A2':['b','c','c'],
'B1':['d','a','c'], 'B2': ['e','d','e']})
A1 A2 B1 B2
0 a b d e
1 a c a d
2 d c c e
我想选择A1
和A2
中的值与B1
和B2
不同的行,或['A1', 'A2']
中值的交集并且['B1', 'B2']
为空,因此在上面的示例中,只应选择第0行。
到目前为止,我能做的最好的事情是使用以下代码遍历我的数据帧的每一行
for i in df.index.values:
if df.loc[i,['A1','A2']].isin(df.loc[i,['B1','B2']]).sum()>0:
df = df.drop(i,0)
有没有办法在没有循环的情况下执行此操作?
答案 0 :(得分:4)
您可以直接测试:
df[(df.A1 != df.B1) & (df.A2 != df.B2) & (df.A1 != df.B2) & (df.A2 != df.B1)]
df = pd.DataFrame({'A1': ['a', 'a', 'd'], 'A2': ['b', 'c', 'c'],
'B1': ['d', 'a', 'c'], 'B2': ['e', 'd', 'e']})
print(df)
print(df[(df.A1 != df.B1) & (df.A2 != df.B2) &
(df.A1 != df.B2) & (df.A2 != df.B1)])
A1 A2 B1 B2
0 a b d e
1 a c a d
2 d c c e
A1 A2 B1 B2
0 a b d e
答案 1 :(得分:2)
使用交集
df['Key1']=df[['A1','A2']].values.tolist()
df['Key2']=df[['B1','B2']].values.tolist()
df.apply(lambda x : len(set(x['Key1']).intersection(x['Key2']))==0,axis=1)
Out[517]:
0 True
1 False
2 False
dtype: bool
df[df.apply(lambda x : len(set(x['Key1']).intersection(x['Key2']))==0,axis=1)].drop(['Key1','Key2'],1)
Out[518]:
A1 A2 B1 B2
0 a b d e
答案 2 :(得分:1)
今天的版本 比需要更复杂的方式
第1章
我们为您带来map
,生成器和set
逻辑
mask = list(map(lambda x: not bool(x),
(set.intersection(*map(set, pair))
for pair in df.values.reshape(-1, 2, 2).tolist())
))
df[mask]
A1 A2 B1 B2
0 a b d e
第2章
Numpy广播
v = df.values
df[(v[:, :2, None] != v[:, None, 2:]).all((1, 2))]
A1 A2 B1 B2
0 a b d e