【问题标题】:need to match 2 columns of 2 different pandas dataframe if it matches we need to attach new data需要匹配2个不同pandas数据框的2列如果匹配我们需要附加新数据
【发布时间】:2019-04-01 11:44:36
【问题描述】:

嗨,我有 2 个非常大的 csv 文件

df1

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

df2

name       stockcode   
apple.inc      appl   
lg.inc          weew   
htc.inc         rrr    
google.com     ggle   

现在我需要检查 df1 中的 m 值与 df2 中的新值是否匹配,我需要将新值的详细信息合并到 df1 中,否则我们需要填充空值

我需要用python请帮帮我

样本输出

x   y  z      keywords                        stockcode    
a   b  c  [apple,iphone,watch,newdevice]       aapl    
e   w  q   NaN                                 null    
w   r  t  [pixel,google,]                      ggle    
s   t  q  [india,computer]                     null    
d   j  o  [google,apple]                      aapl,ggle 

我已经编写了这段代码,但它只是比较一个关键字并给出一个股票代码,如果我们有 2 个在 df2 中匹配的关键字,我需要 2 个股票代码

df1['stockcode'] = np.nan
#mapping data 
for indexKW,valueKW in df1.keyword.iteritems():
    for innerVal in valueKW.split():
        for indexName, valueName in df2['Name'].iteritems():
            for outerVal in valueName.split():
                if outerVal.lower() == innerVal.lower():
                    df1['stockcode'].loc[indexKW] = df2.Identifier.loc[indexName]

上述程序的输出

x   y  z      keywords                        stockcode    
a   b  c  [apple,iphone,watch,newdevice]       aapl    
e   w  q   NaN                                 null    
w   r  t  [pixel,google,]                      ggle    
s   t  q  [india,computer]                     null    
d   j  o  [google,apple]                       ggle

对于最后一行,我有 2 个在 df2 中匹配的关键字,但我只得到一个匹配的关键字 google 的股票代码,我还需要获取苹果的股票代码,如示例输出中所示。

样本输出:-

x   y  z      keywords                        stockcode    
a   b  c  [apple,iphone,watch,newdevice]       aapl    
e   w  q   NaN                                 null    
w   r  t  [pixel,google,]                      ggle    
s   t  q  [india,computer]                     null    
d   j  o  [google,apple]                      aapl,ggle 

请帮帮我

【问题讨论】:

  • 请检查我的解决方案和upvote and accept,如果有任何解决方案提供了您所需的结果。

标签: python pandas dataframe


【解决方案1】:

您可以将 df2 转换为查找字典,然后将其映射到 df1 ;)

import numpy as np
import pandas as pd


data1 = {'x':'a,e,w'.split(','),
         'keywords':['apple,iphone,watch,newdevice'.split(','),
                    np.nan,
                    'pixel,google'.split(',')]}
data2 = {'name':'apple lg htc google'.split(),
        'stockcode':'appl weew rrr ggle'.split()}

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)

mapper = df2.set_index('name').to_dict()['stockcode']

df1['stockcode'] = df1['keywords'].replace(np.nan,'').apply(lambda x : [mapper[i] for i in x if (i and i in mapper.keys())])
df1['stockcode'] = df1['stockcode'].apply(lambda x: x[0] if x else np.nan)

【讨论】:

  • 不知道你可以从两个这样的系列中创建一个字典,+1 非常酷
  • @Datanovice 谢谢
【解决方案2】:

您可以将applymapjoin 一起使用:

df2.set_index('name',inplace=True)
df1.apply(lambda x: pd.Series(x['keywords']).map(df2['stockcode']).dropna().values,1)

0          [appl]
1              []
2          [ggle]
3              []
4    [ggle, appl]
dtype: object

或者:

df1.apply(lambda x: ','.join(pd.Series(x['keywords']).map(df2['stockcode']).dropna()),1)

0         appl
1             
2         ggle
3             
4    ggle,appl
dtype: object

或者:

df1.apply(lambda x: ','.join(pd.Series(x['keywords']).map(df2['stockcode']).dropna()),1)\
                       .replace('','null')
0         appl
1         null
2         ggle
3         null
4    ggle,appl
dtype: object

df1['stockcode'] = df1.apply(lambda x: ','.join(pd.Series(x['keywords'])\
                                          .map(df2['stockcode']).dropna()),1)\
                             .replace('','null')
print(df1)
   x  y  z                           keywords  stockcode
0  a  b  c  [apple, iphone, watch, newdevice]       appl
1  e  w  q                                NaN       null
2  w  r  t                    [pixel, google]       ggle
3  s  t  q                  [india, computer]       null
4  d  j  o                    [google, apple]  ggle,appl

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    相关资源
    最近更新 更多