[英]how to merge pandas dataframe with different lengths
我有一個如下的熊貓數據框。
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
數據框data
中的列item_id
包含重復項,因此:
如果沒有重復性:
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
通過重復,所有重復行都被連接:
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
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'數據框中獲得的行比lengt多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.