比较两个数据帧列并输出第三个

时间:2018-04-17 19:37:23

标签: python pandas join merge

我提前道歉,如果这已经被覆盖,我找不到任何类似的东西。这是我的第一份编程工作(我以前是软件质量保证),而且我一直在打破这个问题。

我有2个数据帧,一个非常大[df2](1460万行),我正在以块的形式迭代它。我试图比较每个数据帧中同名的列,如果它们相等,我想输出更大帧的辅助列。

if df1['tag'] == df2['tag']:
   df1['new column'] = df2['plate']

我试图合并,但这并没有输出我的预期。

df3 = pd.merge(df1, df2, on='tag', how='left')

我希望我能解释这个问题。

[编辑:]我也相信我应该提到df2和df1都有很多额外的列我不想与之交互/改变。是否可以只比较两个数据帧的单个列,并输出第三个附加列?

3 个答案:

答案 0 :(得分:1)

您可以尝试inner合并。首先,您可以inner merge df1使用df2,然后只会针对常见行获取plates,并且可以根据需要重命名新的df1's列< / p>

df1 = df1.merge(df2, on="tag", how = 'inner')

df1['new column'] = df1['plate']
del df1['plate']

我希望这有效。

答案 1 :(得分:0)

这完全属于join/merge。你想把df2放在左边,因为它更小。

df2.join(df1, on='tag', ...)

你只是误解了你想要的type of join/merge):

  

如何:{'左','右','外','内'},默认:'左'

'how'= 'left' join会为LHS df2的所有行创建(不需要的)条目。这不是你想要的(如果df2包含df1中没有看到的其他标记值,你也会得到它们的条目)。

'how'= 'inner'将在'on'='tag'字段上形成df2和df1的交集。即,您只能根据df2获取df1包含有效标记值的条目。

所以:

df3 = df2.join(df1, on='tag', how='inner')
# then reference df3['plate']

或者如果您只想要df3(或其他一些列)中的'plate'列,您可以直接执行:

df2.join(df1, on='tag', how='inner') ['plate']

答案 2 :(得分:0)

正如smci所说,这是使用连接/合并的最佳时机。如果您希望保留df1,则可以使用左连接。所以你走的是正确的道路:

df1 = pd.merge(df1['tag'],
               df2['tag', 'plate'],
               on='tag', how='left')
df1.rename({'plate': 'new column'}, axis='columns')

这只会比较每个数据框中的tag列,因此其他列无关紧要。它会从plate引入df2列,然后将其重命名为您想要命名新列的任何内容。