Подтвердить что ты не робот

Vlookup в 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')

Не работают. Что я делаю не так?

4b9b3361

Ответ 1

Выполните слияние 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

Другим методом является использование map, если вы установите sku в качестве индекса на вашем втором df, так что он становится серией, тогда код упростит это:

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

Ответ 2

Более общее приложение должно было бы использовать 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'])

Добавить как новый столбец dataframe

 **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

Ответ 3

VLoopup в VBA аналогичен pandas.dataframe.merge

Я всегда искал так много процедур для VBA в прошлом, и теперь фрейм данных python экономит мне массу работы, хорошо, что мне не нужно писать метод 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')

внешний или слева действует как SQL, встроенный в python класс DataFrame имеет метод merge, который принимает множество аргументов, что очень подробно и удобно.

Надеюсь, это поможет! Мы делаем вещи более удобными с помощью python!