繁体   English   中英

Pandas - 将一个数据框中的列与另一个数据框中的多个列匹配,并从原始数据框创建新列

[英]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个字符。

即使存在value2dfB的列value1value2也不会始终记录值,但如果存在值,则几乎总是会在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列中的单词并将其解压缩。 之后,我们使用这些提取的单词作为keymerge df1dfA 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM