我有一个数据框说df1
和MULTILEVEL INDEX:
A B C D
0 0 0 1 2 3
4 5 6 7
1 2 8 9 10 11
3 2 3 4 5
我还有另一个数据框,其中包含df2
中的两个公共列,也有MULTILEVEL INDEX
X B C Y
0 0 0 0 7 3
1 4 5 6 7
1 2 8 2 3 11
3 2 3 4 5
我需要从df1
中移除行B
和C
的值与df2
中的值相同的行,所以我应该得到类似这样的内容:
A B C D
0 0 0 1 2 3
0 2 8 9 10 11
我试图通过获取公共元素的索引然后通过列表删除它们来做到这一点,但它们都搞砸了,并且是多层次的。
答案 0 :(得分:1)
您可以使用pandas.dataframe.iloc,numpy.where和numpy.logical_or这样的单行内容执行此操作:(我觉得这是最简单的方法)
df1 = df1.iloc[np.where(np.logical_or(df1['B']!=df2['B'],df1['C']!=df2['C']))]
当然不要忘记:
import numpy as np
输出:
A B C D
0 0 0 1 2 3
1 2 8 9 10 11
希望这有用。如果有任何问题或意见,请随时发表评论。
答案 1 :(得分:0)
您可以从B
和C
列中创建MultiIndex,然后调用索引的isin
方法:
idx1 = pd.MultiIndex.from_arrays([df1['B'],df1['C']])
idx2 = pd.MultiIndex.from_arrays([df2['B'],df2['C']])
mask = idx1.isin(idx2)
result = df1.loc[~mask]
例如,
import pandas as pd
df1 = pd.DataFrame({'A': [0, 4, 8, 2], 'B': [1, 5, 9, 3], 'C': [2, 6, 10, 4], 'D': [3, 7, 11, 5], 'P': [0, 0, 1, 1], 'Q': [0, 0, 2, 3]})
df1 = df1.set_index(list('PQ'))
df1.index.names = [None,None]
df2 = pd.DataFrame({'B': [0, 5, 2, 3], 'C': [7, 6, 3, 4], 'P': [0, 0, 1, 1], 'Q': [0, 1, 2, 3], 'X': [0, 4, 8, 2], 'Y': [3, 7, 11, 5]})
df2 = df2.set_index(list('PQ'))
df2.index.names = [None,None]
idx1 = pd.MultiIndex.from_arrays([df1['B'],df1['C']])
idx2 = pd.MultiIndex.from_arrays([df2['B'],df2['C']])
mask = idx1.isin(idx2)
result = df1.loc[~mask]
print(result)
产量
A B C D
0 0 0 1 2 3
1 2 8 9 10 11