【问题标题】:Python panda merging with multiple valuesPython panda与多个值合并
【发布时间】:2019-04-17 16:19:04
【问题描述】:

我正在尝试合并列 artist_title 上的两个数据框。但是,重复值可能在两列中。在处理大型数据集和大型列时,我稍微简化了数据框。

df1 中,可以提到相同的artist_title,如下例'J. Balvin - Ay Vamos'。

df2 中,'J 也可以有多个值。 Balvin - Ay Vamos'。

如果在df2 中从df1 中找到artist_title,则提供check_code。当有多个值要从df2 返回时,我想从df1 复制一行以添加额外的check_code,以便我可以查看两个(所有)可用代码。

df1:

channel     ID          artist_title

NOW         301         J. Balvin - Ay Vamos
NOW         302         Troye Sivan - Bloom
NOW         303         Christina Milian - Dip It Low
NOW         304         Lorde - Royals
TRENDING    301         J. Balvin - Ay Vamos
TRENDING    305         Mase - Welcome Back
CHILL       306         Bastille - Pompeii

df2:

artist_title               check_code

The Doors - Touch Me       AD9823459
Ricky Martin - She Bangs   SD8845623 
Spice Girls - Wannabe      SDF945345
Daft Punk - Da Funk        KI9023475
J. Balvin - Ay Vamos       URY734586
J. Balvin - Ay Vamos       YH4763523
Troye Sivan - Bloom        EH7623495

期望的结果:

channel     ID          artist_title                    check_code

NOW         301         J. Balvin - Ay Vamos            URY734586
NOW         301         J. Balvin - Ay Vamos            YH4763523
NOW         302         Troye Sivan - Bloom             EH7623495
NOW         303         Christina Milian - Dip It Low   NaN
NOW         304         Lorde - Royals                  NaN
TRENDING    301         J. Balvin - Ay Vamos            URY734586
TRENDING    301         J. Balvin - Ay Vamos            YH4763523
TRENDING    305         Mase - Welcome Back             NaN
CHILL       306         Bastille - Pompeii              NaN

我尝试合并:

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

结果:

它确实会创建额外的行,但它总是包含一个完全不同的“check_code”,而第二个是正确的“check_code”。例如,像这样:

channel     ID          artist_title                    check_code

NOW         301         J. Balvin - Ay Vamos            ABE000149
NOW         301         J. Balvin - Ay Vamos            YH4763523

由于两列都包含重复值,我猜我需要做的不是合并吗?我怎样才能最好地实现上述目标?

添加:df1 有 4405 个值,df2 有 177806 个值。我只想拥有来自df2 的值(如果它们在df1 中)。如果不是,那我就不要它们了。

【问题讨论】:

  • 您是否尝试过使用how='outer'
  • 是的,但这不是我想要的:df1 包含 4405 个值(我想要合并的值),df2 包含 177806 个值。我不想要 df1 中未提及的任何来自 df2 的值
  • 那么您可以只在左侧字段中使用dropna,例如channelID。 (此外,如果您使数据框可复制,则更容易测试我们的答案)
  • 我可能弄错了,但看起来您可能希望 df2 作为合并中的 left 表,不是吗?将 ID 和诸如此类的内容添加到现有的检查代码中?
  • 这听起来可能是数据问题而不是合并问题。您是否查看过 DF 中存在正确和错误 ID 和校验码的行?

标签: python python-3.x pandas dataframe


【解决方案1】:

你可以制作一个字典来映射。

mapper = {}
def make_map(row):
    mapper[row['artist_title']] = row['check_code']
df2.apply(make_map,axis=1)

df['check_code'] = df['artist_title'].map(mapper)

哪个应该返回预期的结果(删除了我的结果,因为我在将信息传输到 python 时搞砸了,这需要很长时间)

【讨论】:

  • 啊太棒了!这似乎适用于我的数据集,谢谢! :)
  • 没问题。如果您喜欢答案,请记得将其标记为答案:)
猜你喜欢
  • 1970-01-01
  • 2022-11-04
  • 2018-08-14
  • 2021-02-26
  • 2015-09-12
  • 2021-05-15
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多