pandas 当我尝试根据特定列筛选不在另一个DataFrame中的DataFrame中的行时,列更改名称

hzbexzde  于 2023-01-15  发布在  其他
关注(0)|答案(2)|浏览(133)

以下是答案:
https://stackoverflow.com/a/47107164/11462274
我尝试创建一个DataFrame,它只包含在另一个DataFrame中找不到的行,但是,不是根据所有列,而是只根据某些特定列,所以我尝试这样做:

import pandas as pd

df1 = pd.DataFrame(data = {'col1' : [1, 2, 3, 4, 5, 3], 
                           'col2' : [10, 11, 12, 13, 14, 10],
                           'col3' : [1,5,7,9,6,7]}) 
df2 = pd.DataFrame(data = {'col1' : [1, 2, 3],
                           'col2' : [10, 11, 12],
                           'col3' : [1,5,8]})

df_merge = df1.merge(df2.drop_duplicates(), on=['col1','col3'], 
                   how='left', indicator=True)

df_merge = df_merge.query("_merge == 'left_only'")[df1.columns]
print(df_merge)

但请注意,当不使用所有列时,它们会将名称更改为col2,例如:

col1  col2_x  col3  col2_y     _merge
0     1      10     1    10.0       both
1     2      11     5    11.0       both
2     3      12     7     NaN  left_only
3     4      13     9     NaN  left_only
4     5      14     6     NaN  left_only
5     3      10     7     NaN  left_only

因此,当我尝试创建不包含不必要列的最终DataFrame时,没有找到未使用的列来生成所需的过滤器:

KeyError(f"{not_found} not in index")
KeyError: "['col2'] not in index"
guz6ccqo

guz6ccqo1#

可以使用pandas.DataFrame.mergesuffixes参数:

df_merge = df1.merge(df2.drop_duplicates(), on=['col1','col3'], 
                   how='left', indicator=True, suffixes=("", "_"))
​
df_merge = df_merge.query("_merge == 'left_only'")[df1.columns]

输出:

print(df_merge)
   col1  col2  col3
2     3    12     7
3     4    13     9
4     5    14     6
5     3    10     7
fjaof16o

fjaof16o2#

另一种选择是,考虑到它是left连接,您可以只删除 * other * df中您知道会重叠的列(从而得到更小的合并结果):

df_merge = df1.merge(df2.drop_duplicates().drop(columns=['col2']), 
                     on=['col1','col3'], how='left', indicator=True)

df_merge = df_merge.query("_merge == 'left_only'")[df1.columns]
print(df_merge)
col1  col2  col3
2     3    12     7
3     4    13     9
4     5    14     6
5     3    10     7

相关问题