我有一个像下面的pandas数据框..
df_fav_dish
item_id buyer_id dish_count dish_name
121 261 2 Null
126 261 3 Null
131 261 7 Null
132 261 6 Null
133 261 2 Null
135 261 2 Null
139 309 2 Null
140 261 2 Null
142 261 2 Null
143 153 3 Null
145 64 2 Null
148 261 2 Null
155 261 2 Null
156 64 2 Null
163 261 2 Null
以上数据帧的长度为34.我还有另一个数据帧如下......
data
item_id item_name
121 Paneer
126 Chicken
131 Prawns
132 Mutton
133 Curd
139 Mocktail
140 Cocktail
142 Biryani
143 Thai Curry
145 Red Curry
148 Fish
155 Lobster
69 Fish Curry
67 Butter
31 Bread
59 Egg Curry
以上数据帧的长度为322.该数据帧包含近300个item_id和相应的项目名称 现在我想在item_id上加入这两个数据帧。两个数据帧具有不同的长度。 我在python中做了以下。
df_fav_dish.merge(data[['item_name','item_id']],how='left',on='item_id')
但它给了我很多行。我只想将item_name
添加到第二个数据帧的第一个数据帧,其中item_id
彼此相等
所需的输出
item_id buyer_id dish_count dish_name item_name
121 261 2 Null paneer
126 261 3 Null Chicken
131 261 7 Null prawns
132 261 6 Null Mutton
133 261 2 Null Curd
135 261 2 Null
139 309 2 Null Mocktail
140 261 2 Null Cocktail
142 261 2 Null Biryani
143 153 3 Null Thai Curry
145 64 2 Null Red Curry
148 261 2 Null Fish
155 261 2 Null Lobster
156 64 2 Null
163 261 2 Null
答案 0 :(得分:2)
数据框item_id
中的列data
包含双重性,因此:
如果没有两面性:
print data
item_id item_name
0 121 Paneer
1 140 Chicken
2 131 Prawns
print df_fav_dish
item_id buyer_id dish_count dish_name
0 139 309 2 Null
1 140 261 2 Null
2 142 261 2 Null
3 143 153 3 Null
print df_fav_dish.merge(data[['item_name','item_id']],how='left',on='item_id')
item_id buyer_id dish_count dish_name item_name
0 139 309 2 Null NaN
1 140 261 2 Null Chicken
2 142 261 2 Null NaN
3 143 153 3 Null NaN
使用duplicity将所有重复行连接起来:
print data
item_id item_name
0 140 Paneer
1 140 Chicken
2 140 Prawns
print df_fav_dish
item_id buyer_id dish_count dish_name
0 139 309 2 Null
1 140 261 2 Null
2 142 261 2 Null
3 143 153 3 Null
print df_fav_dish.merge(data[['item_name','item_id']],how='left',on='item_id')
item_id buyer_id dish_count dish_name item_name
0 139 309 2 Null NaN
1 140 261 2 Null Paneer
2 140 261 2 Null Chicken
3 140 261 2 Null Prawns
4 142 261 2 Null NaN
5 143 153 3 Null NaN
所以你可以drop_duplicates
:
# Drop duplicates except for the first occurrence
print df.drop_duplicates(subset='item_id', keep='first')
item_id buyer_id dish_count dish_name item_name
0 139 309 2 Null NaN
1 140 261 2 Null Paneer
4 142 261 2 Null NaN
5 143 153 3 Null NaN
# Drop duplicates except for the last occurrence
print df.drop_duplicates(subset='item_id', keep='last')
item_id buyer_id dish_count dish_name item_name
0 139 309 2 Null NaN
3 140 261 2 Null Prawns
4 142 261 2 Null NaN
5 143 153 3 Null NaN
# Drop all duplicates
print df.drop_duplicates(subset='item_id', keep=False)
item_id buyer_id dish_count dish_name item_name
0 139 309 2 Null NaN
4 142 261 2 Null NaN
5 143 153 3 Null NaN
答案 1 :(得分:0)
df_new = pd.merge(df_fav_dish,data[['item_name','item_id']],left_on='item_id',right_on='item_id',how='left')
与你的代码相同。
我假设每个item_id都有一个唯一的item_name?如果没有,这就是为什么你得到的行数比'df_fav_dish'数据帧的长度要多..