【问题标题】:How to merge two dataframes based on a common column but duplicated values?如何基于公共列但重复值合并两个数据框?
【发布时间】:2019-02-21 21:24:51
【问题描述】:

我有两个具有相同列但数据不同的数据框。一个是包含 20,000 个条目的样本数据集,另一个是包含 1,093,564 个条目的控制数据集。我想从控制数据集中提取相同数量的记录,这些记录与示例数据集中的期刊名称相同,但文章(标题)是唯一的。

df1:

journal title
foo abs
bar abc
baz ghj
foo jkl
baz mnj

df2:

journal title
bar nko
foo cvb
foo yui
baz sdf 
bar hyt
foo kdm
baz bnd
baz lko
foo mnx
bar sdm
baz rty    

两个数据集中的期刊名称相同,但 df1 和 df2 中的标题是唯一的并且不同。我想要这样的结果:

journal title_x title_y
foo abs cvb
bar abc nko
baz ghj sdf
foo jkl kdm
baz mnj bnd

【问题讨论】:

  • 你可能需要merge 这两个数据集和how=left,但如果没有一些例子,很难真正帮助你。您能否将您的问题简化为 2 个数据集,其中包含一些非常小的数据子集并将它们展示给我们?
  • 你觉得How to merge two dataframes based on a common column but duplicated values? 吗?删除了no

标签: python pandas


【解决方案1】:

merge 与左连接一起使用,但首先需要创建计数器列以用于合并并删除df2['journal'] 中的连续重复值,并通过不相等的移位值进行比较:

df1['g'] = df1.groupby('journal').cumcount()
df2 = df2[df2['journal'].ne(df2['journal'].shift())]
df2['g'] = df2.groupby('journal').cumcount()

df = df1.merge(df2, on=['journal','g'], how='left').drop('g', axis=1)
print (df)
  journal title_x title_y
0     foo     abs     cvb
1     bar     abc     nko
2     baz     ghj     sdf
3     foo     jkl     kdm
4     baz     mnj     bnd

【讨论】:

  • 就像一个魅力。我被困了好几天,祝你幸福!
  • @TabKey - 谢谢,这有点复杂,就像只有merge,但感谢您提供完美的样本数据:)
  • 我想我也应该编辑问题陈述。你说什么? @jezrael
  • 我认为通过重复值合并应该不错;)
猜你喜欢
  • 2016-01-05
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
  • 2019-05-01
  • 1970-01-01
  • 2020-11-22
  • 2013-05-16
相关资源
最近更新 更多