我提前道歉,如果这已经被覆盖,我找不到任何类似的东西。这是我的第一份编程工作(我以前是软件质量保证),而且我一直在打破这个问题。
我有2个数据帧,一个非常大[df2](1460万行),我正在以块的形式迭代它。我试图比较每个数据帧中同名的列,如果它们相等,我想输出更大帧的辅助列。
即
if df1['tag'] == df2['tag']:
df1['new column'] = df2['plate']
我试图合并,但这并没有输出我的预期。
df3 = pd.merge(df1, df2, on='tag', how='left')
我希望我能解释这个问题。
[编辑:]我也相信我应该提到df2和df1都有很多额外的列我不想与之交互/改变。是否可以只比较两个数据帧的单个列,并输出第三个附加列?
答案 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
列,然后将其重命名为您想要命名新列的任何内容。