Ale*_*man 36 python join 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
Run Code Online (Sandbox Code Playgroud)
我想使用Pandas(或最好的Python运算符)执行合并或加入opertation来生成以下数据框.
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')
Run Code Online (Sandbox Code Playgroud)
不工作.我究竟做错了什么?
EdC*_*ica 62
执行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
Run Code Online (Sandbox Code Playgroud)
如果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
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用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
Run Code Online (Sandbox Code Playgroud)
更通用的应用程序是使用applyand ,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'])
Run Code Online (Sandbox Code Playgroud)
添加为新的数据框列
**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
Run Code Online (Sandbox Code Playgroud)
或者替换现有的 ('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
Run Code Online (Sandbox Code Playgroud)