熊猫比较2个不同列名称和不同形状的数据框

时间:2020-08-07 05:06:10

标签: python pandas dataframe

我有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

感谢和感谢。

2 个答案:

答案 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