我需要比较 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 中用空值填充的主要内容,如果未能解决你的问题,请参考以下文章