簡體   English   中英

如何合並不同長度的熊貓數據框

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM