如何合并不同长度的pandas数据帧

时间:2016-01-28 12:17:02

标签: python pandas

我有一个像下面的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     

2 个答案:

答案 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'数据帧的长度要多..