2017-08-03 58 views
1

大家好,所以我有2个数据帧我试图合并,组中某个特定的顺序:在特定的顺序重新组织数据帧

df1 
    LC_REF  Category  PRDGRP 
0 17 1C  H   Ferrari,Lambo,Merc 
1 17 1C  M   Doritos,Lays,Funyun 
2 17 1C  P   Cats,Dogs,Rabbits 
3 16 2C  H   Aston,Hyundai,Honda 
4 16 2C  M   Cheeto, Vicks 
5 16 2C  P   Rat,Pig,Flamingo 
6 17 2C  M   See,Sea,Far 


df2 
    LC_REF  Category  PRDGRP 
0 17 1C   H   foo,bar 
1 17 1C   M   foo,bar1 
2 16 2C   H   foo,bar2 
3 16 2C   M   foo,bar3 
4 17 2C   H   foo,bar4 
5 17 2C   M   foo,bar5 
6 17 2C   P   foo,bar6 

我期待合并它们,这样一个LC_REF的所有M的堆叠,然后是所有的H,然后是所有的P,然后移动到第二个LC_REF。顺序无关紧要,但应保持一致。希望这是有道理的:

df3 
    LC_REF  Category  PRDGRP 
0 17 1C  M   Doritos,Lays,Funyun 
1 17 1C  M   foo,bar1 
2 17 1C  H   Ferrari,Lambo,Merc 
3 17 1C  H   foo,bar 
4 17 1C  P   Cats,Dogs,Rabbits 
5 16 2C  M   Cheeto, Vicks 
6 16 2C  M   foo,bar3 
7 16 2C  H   Aston,Hyundai,Honda 
8 16 2C  H   foo,bar4 
9 17 2C  M   See,Sea,Far 
10 17 2C  M   foo,bar5 
11 17 2C  P   foo,bar6 

我试过CONCAT的变化和追加无济于事:

pd.concat([df1,df2]).sort_index().reset_index(drop=True) 

几乎接近,但LC_REF乱序

回答

2

让我们用pd.concatsort_values

df_out = pd.concat([df1,df2]) 
df_out['Category'] = df_out.Category.astype('category', categories=['M','H','P'], ordered=True) 
df_out.sort_values(by=['LC_REF','Category']) 

输出:

LC_REF Category    PRDGRP 
4 16 2C  M  Cheeto, Vicks 
3 16 2C  M    foo,bar3 
3 16 2C  H Aston,Hyundai,Honda 
2 16 2C  H    foo,bar2 
5 16 2C  P  Rat,Pig,Flamingo 
1 17 1C  M Doritos,Lays,Funyun 
1 17 1C  M    foo,bar1 
0 17 1C  H Ferrari,Lambo,Merc 
0 17 1C  H    foo,bar 
2 17 1C  P Cats,Dogs,Rabbits 
6 17 2C  M   See,Sea,Far 
5 17 2C  M    foo,bar5 
4 17 2C  H    foo,bar4 
6 17 2C  P    foo,bar6 
+0

疯了!我只是尝试了类似的东西。有没有办法保留原来的订单? – codeninja

+0

关闭...这是我第一次猜测。类别订单已关闭。 –

+0

我想我不明白。 –