web-dev-qa-db-ja.com

vlookup in Pandas結合を使用して

次の2つのデータフレームがあります

Example1
sku loc flag  
122  61 True 
123  61 True
113  62 True 
122  62 True 
123  62 False
122  63 False
301  63 True 

Example2 
sku dept 
113 a
122 b
123 b
301 c 

マージを実行するか、またはPandas(またはいずれかPython演算子が最適))を使用して操作を結合して、以下のデータフレームを生成したい。

Example3
sku loc flag   dept  
122  61 True   b
123  61 True   b
113  62 True   a
122  62 True   b
123  62 False  b
122  63 False  b
301  63 True   c

Both 
df_Example1.join(df_Example2,lsuffix='_ProdHier')
df_Example1.join(df_Example2,how='outer',lsuffix='_ProdHier')

動作していません。何が間違っていますか?

35
Alex Kinman

leftマージを実行します。これは、結合する列としてsku列を使用します。

In [26]:

df.merge(df1, on='sku', how='left')
Out[26]:
   sku  loc   flag dept
0  122   61   True    b
1  122   62   True    b
2  122   63  False    b
3  123   61   True    b
4  123   62  False    b
5  113   62   True    a
6  301   63   True    c

skuが実際にインデックスである場合、これを行います:

In [28]:

df.merge(df1, left_index=True, right_index=True, how='left')
Out[28]:
     loc   flag dept
sku                 
113   62   True    a
122   61   True    b
122   62   True    b
122   63  False    b
123   61   True    b
123   62  False    b
301   63   True    c

もう1つの方法は、2番目のdfのインデックスとしてmapを設定する場合、skuを使用することです。そのため、実質的にSeriesになり、コードはこれに単純化されます。

In [19]:

df['dept']=df.sku.map(df1.dept)
df
Out[19]:
   sku  loc   flag dept
0  122   61   True    b
1  123   61   True    b
2  113   62   True    a
3  122   62   True    b
4  123   62  False    b
5  122   63  False    b
6  301   63   True    c
60
EdChum

より一般的なアプリケーションは、次のようにapplyおよびlambdaを使用することです。

dict1 = {113:'a',
         122:'b',
         123:'b',
         301:'c'}

df = pd.DataFrame([['1', 113],
                   ['2', 113],
                   ['3', 301],
                   ['4', 122],
                   ['5', 113]], columns=['num', 'num_letter'])

新しいデータフレーム列として追加

 **df['letter'] = df['num_letter'].apply(lambda x: dict1[x])**

  num  num_letter letter
0   1         113      a
1   2         113      a
2   3         301      c
3   4         122      b
4   5         113      a

または、既存の( 'num_letter')列を置き換えます

 **df['num_letter'] = df['num_letter'].apply(lambda x: dict1[x])**

  num num_letter
0   1          a
1   2          a
2   3          c
3   4          b
4   5          a
2
Amir F

VBAのVLoopupは、pandas.dataframe.mergeと同じです。

私は過去にVBAの非常に多くの手順を常に探していましたが、今ではpython dataframeで多くの作業を節約できます。良いことはvlookupメソッドを書く必要がないことです。

pandas.DataFrame.merge

>>> A              >>> B
    lkey value         rkey value
0   foo  1         0   foo  5
1   bar  2         1   bar  6
2   baz  3         2   qux  7
3   foo  4         3   bar  8
>>> A.merge(B, left_on='lkey', right_on='rkey', how='outer')
   lkey  value_x  rkey  value_y
0  foo   1        foo   5
1  foo   4        foo   5
2  bar   2        bar   6
3  bar   2        bar   8
4  baz   3        NaN   NaN
5  NaN   NaN      qux   7

以下を試して、左マージを実行することもできます。

import pandas as pd
pd.merge(left, right, left_on = 'key', right_on = 'key', how='left')

outerまたはleftSQLのように動作し、Pythonの組み込みクラスDataFrameにはメソッドのマージは多くの引数を取ります。これは非常に詳細で便利です。

1
flowera