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

问题描述 投票:1回答:3

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

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

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

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

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

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

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

python pandas join merge
3个回答
1
投票

你可以尝试inner合并。首先,您可以使用inner merge df1 df2,然后您将获得仅适用于常见行的plates,您可以根据需要重命名新的df1's

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

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

我希望这有效。


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列,然后将其重命名为您想要命名的新列。


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']
© www.soinside.com 2019 - 2024. All rights reserved.