比较两个数据帧中公共行的pandas数据帧

时间:2016-07-23 14:04:46

标签: python pandas

我有两个数据帧df-1和df-2,像这样,

import pandas as pd

raw_data = {'company': ['comp1', 'comp1', 'comp1', 'comp1', 'comp2', 'comp2', 'comp2', 'comp2', 'comp3', 'comp3', 'comp3', 'comp3'], 
        'region': ['1st', '1st', '2nd', '2nd', '1st', '1st', '2nd', '2nd','1st', '1st', '2nd', '2nd'], 
        'name': ['John', 'Jake', 'Alice', 'Mathew', 'Mark', 'Jacon', 'Ryan', 'Sone', 'Steve', 'Rooke', 'Rani', 'Alice'], 
        'preTestScore': [4, 24, 31, 2, 3, 4, 24, 31, 2, 3, 2, 3],
        'postTestScore': [25, 94, 57, 62, 70, 25, 94, 57, 62, 70, 62, 70]}
df1 = pd.DataFrame(raw_data, columns = ['company', 'region', 'name', 'preTestScore'])
print df1


raw_data = {'company': [ 'comp1', 'comp1', 'comp2', 'comp2', 'comp2', 'comp2', 'comp3', 'comp3', 'comp3'], 
        'region': [ '2nd', '2nd', '1st', '1st', '2nd', '2nd','1st', '1st', '2nd'], 
        'name': [ 'Alice', 'Mathew', 'Mark', 'Jacon', 'Ryan', 'Sone', 'Steve', 'Rooke', 'Rani', ], 
        'status': [ 'great', 'average', 'average', 'average', 'good', 'great', 'average', 'average', 'average']}
df2 = pd.DataFrame(raw_data, columns = ['company', 'region', 'name', 'status'])
print df2

如何在df-1中找到与df-2相同的公司,地区和名称行。换句话说,如何使用所有三列的组合来查找内部联接。

2 个答案:

答案 0 :(得分:3)

这取决于你的意思

  

df-1中的行与df-2相同。

因为列不相同。

如果您指的是列的交集具有相同值的行,则可以执行inner join user merge

In [13]: pd.merge(df1, df2, how='inner')
Out[13]: 
  company region    name  preTestScore   status
0   comp1    2nd   Alice            31    great
1   comp1    2nd  Mathew             2  average
2   comp2    1st    Mark             3  average
3   comp2    1st   Jacon             4  average
4   comp2    2nd    Ryan            24     good
5   comp2    2nd    Sone            31    great
6   comp3    1st   Steve             2  average
7   comp3    1st   Rooke             3  average
8   comp3    2nd    Rani             2  average

修改

如果您希望更好地控制加入列,可以使用on功能的left_onright_onmerge参数。如果你不这样做,pandas就会假设你指的是两个数据帧的列。

答案 1 :(得分:0)

result = pd.merge(df1,df2, on=['company','region','region'],how="left")