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')
Не работают.
Что я делаю не так?
Ответы
Ответ 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!