我有一个数据框架,比如具有多级索引的df1:
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中有两个公共列,也有多级索引。
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我试图通过获取公共元素的索引,然后通过列表删除它们,但是它们都是混乱的,并且是多层次的。
发布于 2017-07-08 13:43:42
您可以使用pandas.dataframe.iloc、numpy.where和或在一个班轮中这样做:(我认为这是最简单的方法)。
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希望这能帮上忙。如果有任何问题或意见,请随时评论。
发布于 2017-07-08 13:32:57
可以将MultiIndexes从B和C列中提取出来,然后调用索引的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 11https://stackoverflow.com/questions/44986651
复制相似问题