vlookup в панд с помощью join
у меня есть следующие 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')
не работают. Что я делаю не так?
3 ответов
выполнить left
merge, это будет использовать 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
более общим приложением было бы использовать 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
VLoopup в VBA так же, как панды.фрейм данных.слияние
Я всегда ищу так много процедур для VBA в прошлом, и теперь python dataframe экономит мне тонну работы, хорошо, что мне не нужно писать метод vlookup.
>>> 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, встроенный класс DataFrame python имеет метод слияния занимает много args, что очень подробно и удобно.