我有2个具有不同编号的数据框。行和不同的列名称。我想比较并获取特定于该列的匹配行作为输出。
例如
df1 = pd.DataFrame({'foo': [11, 22, 33], 'bar': ['aa', 'ab', 'ac'], 'foobar': [111, 222, 333]})
df2 = pd.DataFrame({'AA': [1,22], 'BB': ['see','ab'], 'CC': [123,222]})
df1: foo bar foobar
0 11 aa 111
1 22 ab 222
2 33 ac 333
df2: AA BB CC
0 1 see 123
1 22 ab 222
df2不一定必须具有相同的行和列数。
预期输出:用于匹配df1中df2的行
df3:
foo bar foobar
1 22 ab 222
我尝试使用np.all,但这似乎只有在我们没有相同的情况下才有效。 df2中的行数或单行数。
df3 = df1.loc[np.all(df1[['bar','foobar']].values == df2[['BB','CC']].values, axis=1),:]
df1或df2中任何一个的必要行,差异行或匹配行。
预期输出:来自df2的df1不匹配的行
df3:
foo bar foobar
0 11 aa 111
2 33 ac 333
想象一下这种情况:列的顺序不同,我将做列映射。例如:(如果df1的a,b,c的列值== df2中的d,e,f的列值),则以df1或df2的形式获取匹配的行。
df1 = pd.DataFrame({'foo': [11, 22, 33], 'bar': ['aa', 'ab', 'ac'], 'foobar': [111, 222, 333], 'barfoo':[2,22,34]})
df2 = pd.DataFrame({'AA': [22,33], 'CC': [222,333], 'BB': ['ab','ac']})
输出:在这种情况下,我在(foo:AA,bar:BB,foobar:CC)上匹配
df3:
foo bar foobar barfoo
1 22 ab 222 22
2 33 ac 333 34
感谢和感谢。
答案 0 :(得分:1)
您可以临时重命名df2
的列并在两个数据帧上执行内部联接(也称为merge
)。它将找到两个数据框中都存在的所有行:
mapper = dict(zip(df2, df1)) # Column mapper
df2.rename(columns=mapper).merge(df1)
# foo bar foobar
#0 22 ab 222
答案 1 :(得分:0)
import pandas as pd
df1 = pd.DataFrame({'foo': [11, 22, 33], 'bar': ['aa', 'ab', 'ac'], 'foobar': [111, 222, 333]})
df2 = pd.DataFrame({'AA': [1,22], 'BB': ['see','ab'], 'CC': [123,222]})
df3 = df2.rename({'AA': 'foo', 'BB': 'bar', 'CC': 'foobar'})
df3 = df1.merge(df3, how = 'inner' ,indicator=False)
print('df1\n',df1)
print('df2\n',df2)
print('df3\n',df3)
输出
df1
foo bar foobar
0 11 aa 111
1 22 ab 222
2 33 ac 333
df2
AA BB CC
0 1 see 123
1 22 ab 222
df3
foo bar foobar
0 22 ab 222