【问题标题】:Comparing two dataframe columns and outputting a third比较两个数据框列并输出第三个
【发布时间】:2018-09-27 21:33:43
【问题描述】:

如果这已经被覆盖,我提前道歉,我找不到类似的东西。这是我的第一份编程工作(我之前是软件 QA),我一直在为此苦苦挣扎。

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


【解决方案1】:

您可以尝试inner 合并。首先,您可以 inner merge df1df2 然后您将获得 plates 仅用于公共行,您可以根据需要重命名新的 df1's

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

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

我希望这有效。

【讨论】:

  • @seclusion 如果你想创建新的数据框,那也可以工作,因为你只需要有限的列。
  • 我试过这个但收到一个错误,我相信这是由于第一个数据帧 (df1) 没有 "plate" 列。我意识到他们每个人都需要相同的列(标签)才能合并,是否还需要有板列才能使合并成功?
  • 不,您只需要一个公共列tag 来合并两个数据框。您可以分享您正在尝试的屏幕截图吗?
  • 澄清“ISO 波段”是“标签”。非常感谢您的帮助:imgur.com/a/Trw6Y
  • 你一步之遥,只需要在第50行添加,df1 = df1.......,直到你添加对数据框df1的更改,它不会被反映。跨度>
【解决方案2】:

正如 smci 所提到的,这是使用 join/merge 的最佳时机。如果您想保留df1,左连接就是您想要的。所以你是在正确的道路上:

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

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

【讨论】:

    【解决方案3】:

    这完全是join/merge 的情况。你想把 df2 放在左边,因为它更小。

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

    您只是误解了您要制作的type of join/merge):

    how : {‘left’, ‘right’, ‘outer’, ‘inner’},默认:‘left’

    'how'='left' 连接将为 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']
    

    【讨论】:

    • 这将如何输出第三列 df2['plate']?我不认为我完全遵循。
    • @seclusion:然后在结果上取一个列切片['plate'],例如df3['plate']
    猜你喜欢
    • 2021-09-17
    • 1970-01-01
    • 2020-02-24
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多