我需要比较 2 个不同数据帧的 2 个字段,如果它匹配我们需要填充详细信息,否则在 python 中用空值填充

Posted

技术标签:

【中文标题】我需要比较 2 个不同数据帧的 2 个字段,如果它匹配我们需要填充详细信息,否则在 python 中用空值填充【英文标题】:I need to compare 2 fields of 2 different dataframe if it matches we need to fill details else fill with null values in python 【发布时间】:2019-03-10 04:15:21 【问题描述】:

我有 2 个 csv 文件 df1

x   y  z      m
a   b  c  [apple,iphone,watch,newdevice]
e   w  q   NaN
w   r  t  [pixel,google]
s   t  q  [india,computer]

df2

new      code    file
apple    appl    ofo
lg       weew    ofe
htc      rrr     ofr
google   ggle    ofg

现在我需要检查 df1 中的 m 值与 df2 中的新值是否匹配,我需要将新值的详细信息与 df1 结合起来,否则我们需要填充空值 我需要使用python请帮助我

样本输出

x   y  z      m                                code     file
a   b  c  [apple,iphone,watch,newdevice]       aapl     ofo
e   w  q   NaN                                 null     null
w   r  t  [pixel,google,]                      ggle     ofg
s   t  q  [india,computer]                     null     null

【问题讨论】:

m 是一列列表吗? 是的,它是一列列表 合并列是否总是列表中的第一项?如果是这种情况,它会简化很多 @SvenH。不,可能不是这样,它可能会改变:- [iphone , apple] 或 [iphone , watch , apple] 或 [pixel,google,pixelbuds] 列表是否可以像['apple', 'google'] 一样映射到df2 中的多行? 【参考方案1】:

这是一种基于 NumPy 的方法,通过 np.isin 测试 2d 数组中的每个值与 1d 数组。但实际上这应该被视为最后的手段:串联列表效率低下,您将面临大型数据集的性能问题。

注意argmax 将仅检查 第一个 匹配项,如果列表中存在多个匹配项。

import pandas as pd, numpy as np

df1 = pd.DataFrame('x': list('aws'), 'y': list('brt'), 'z': list('ctq'),
                    'm': [['apple', 'iphone', 'watch', 'newdevice'],
                          ['google', 'pixel'], ['india', 'computer']])

split = pd.DataFrame(df1['m'].values.tolist()).values
mask = np.isin(split, df2['new'].values).argmax(1)
df1['new'] = split[np.arange(split.shape[0]), mask]

df = pd.merge(df1, df2, on='new', how='left').drop('new', 1)

print(df)

   x  y  z                                  m  code file
0  a  b  c  [apple, iphone, watch, newdevice]  appl  ofo
1  w  r  t                    [google, pixel]  ggle  ofg
2  s  t  q                  [india, computer]   NaN  NaN

【讨论】:

其实我有一个非常大的数据集,我不能像你那样手动插入值。 df1 = pd.DataFrame('x': list('aws'), 'y': list('brt'), 'z': list('ctq'), 'm': [['apple', 'iphone', 'watch', 'newdevice'], ['google', 'pixel'], ['india', 'computer']]) @RahulVarma,那么你不应该使用系列列表! Pandas 可能不是适合您数据的数据结构。 但是数据的格式和我上面展示的一样。 @RahulVarma,我已经精确地创建了您在问题中显示的内容。为什么不使用数据框的定义更新您的问题?如果您遇到困难,请参阅 How to make good reproducible pandas examples。

以上是关于我需要比较 2 个不同数据帧的 2 个字段,如果它匹配我们需要填充详细信息,否则在 python 中用空值填充的主要内容,如果未能解决你的问题,请参考以下文章

Spark 数据框无法比较 Null 值

Spark 中的数据框比较:Scala

如何比较两个数据帧的内容? [重复]

比较 2 个不同表列的有效方法

如何在不拆分数据帧的情况下传递不同的数据集进行训练和测试。 (Python)?

尝试获取2个字段以匹配第二个工作表中的数据并返回值