![](/img/trans.png)
[英]Create a new column in the original dataframe if the column from another dataframe and a column from original dataframe have matching values
[英]Pandas - matching values from a column in one dataframe to several columns in another dataframe and creating new columns from the original dataframe
我有两个数据帧无法在任何值上连接,但第一个数据帧( dfA
)中有一列值可能与第二个数据帧( dfB
)的多列中的值匹配,也可能不匹配。 'text_bod'列具有特别大的值,平均字符串长度为~1500个字符。
即使存在value2
, dfB
的列value1
和value2
也不会始终记录值,但如果存在值,则几乎总是会在text_bod
列的文本中找到它。 我想弄清楚dfA
中的值dfA
存在于dfB
。
如果dfA
存在dfB
的值,我想将dfA
一些信息附加到找到值的数据dfA
的新列。 例如,我想在dfB
添加“名称”,“颜色”和“动物”列,然后为找到的值附加相应的名称,颜色和动物。
这是我到目前为止所提出的:
def extract(t):
s = ('|').join(dfA['value'])
return re.search(s, t)
tqdm.pandas()
dfB['value'] = dfB['text_bod'].progress_map(extract)
我很想听听有关如何1)优化此搜索的任何建议,2)将与值对应的信息附加到dfB
新列。
dfA
(约200,000行)
value name color animal
0 es9bum name1 red dolphin
1 qgl8 name2 cerulean mountaingoat
2 klkwv name3 platinum mantisshrimp
3 tokgs name4 fuchsia tarantula
4 cnwsaq5 name5 frost gentoopenguin
dfB
(~1,500,000行)
value1 value2 text_bod
0 null tokgs here are some tokgs
1 null null something es9bum
2 klkwv null blahblahblahklkwv
3 null null boop: qgl8. more&&
4 null null hi it me
5 null null here are more words
6 y2kbc null words and stuff
7 null null so much text
8 null null have a nice cnwsaq5
9 null null null
这是我想输出的内容:
dfB
(~1,500,000行)
value1 value2 text_bod name color animal
0 null tokgs here are some tokgs name4 fuchsia tarantula
1 null null something es9bum name1 red dolphin
2 klkwv null blahblahblahklkwv name3 platinum mantisshrimp
3 null null boop: qgl8. more&& name2 cerulean mountaingoat
4 null null hi it me NaN NaN NaN
5 null null here are more words NaN NaN NaN
6 y2kbc null words and stuff name99 onyx direwolf
7 null null so much text NaN NaN NaN
8 null null have a nice cnwsaq5 name5 frost gentoopenguin
9 null null null NaN NaN NaN
我们可以使用str.extract
来查找text_bod
列中的单词并将其解压缩。 之后,我们使用这些提取的单词作为key
, merge
df1
与dfA
merge
,将所需的列合并在一起。
s = ('|').join(dfA['value'])
df1['value'] = df1['text_bod'].str.extract('({})'.format(s))
df1 = df1.merge(dfA, on='value', how='left').drop('value', axis=1)
print(df1)
value1 value2 text_bod name color animal
0 NaN tokgs here are some tokgs name4 fuchsia tarantula
1 NaN NaN something es9bum name1 red dolphin
2 klkwv NaN blahblahblahklkwv name3 platinum mantisshrimp
3 NaN NaN boop: qgl8. more&& name2 cerulean mountaingoat
4 NaN NaN hi it me NaN NaN NaN
如果你有Python 3.6或更高版本
我们可以在第三行使用f-strings
,这使我们的代码更清晰:
df1['value'] = df1['text_bod'].str.extract(f'({s})')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.