如何按两行比较值

时间:2019-03-04 15:31:02

标签: pandas pandas-groupby

如何选择具有[nbr]列包含不同值的行。

某些[st_id]可能只有一条记录。

   st_id       trc      dir  nbr    
   88900     4009114     1   2  
   88900     4009114     2   2    
   88000     4009115     1   2    
   88000     4009115     2   2    
   88300     4009113     1   3   
   88300     4009113     2   2   
   88400     4009110     1   4  
   88500     5120012     1   1
   88500     5120013     2   2
   88600     1270081     1   3

结果:

   st_id       trc      dir  nbr    
   88300     4009113     1   3   
   88300     4009113     2   2   
   88500     5120012     1   1
   88500     5120013     2   2

2 个答案:

答案 0 :(得分:0)

您可以首先使用drop_duplicates为每个st_id, nbr对获取一行,然后仅groupbyst_id查找其中多个{{1} }存在:

nbr

答案 1 :(得分:0)

您的数据:

       st_id      trc  dir  nbr
    0  88900  4009114    1    2
    1  88900  4009114    2    2
    2  88000  4009115    1    2
    3  88000  4009115    2    2
    4  88300  4009113    1    3
    5  88300  4009113    2    2

如果使用的是熊猫数据框,则可以使用交叉表。然后将交叉制表转换为DataFrame。请注意,您已经在概念上将nbr变量转换为类别(nbr = 2或nbr = 3),因此,我将新列(告诉您它们属于2或3属于哪个nbr类)重命名为列:nbr_2nbr_3

    pd.crosstab([df.st_id, df.trc,df.dir], df.nbr)
    df.reset_index(inplace=True)
    df.columns=['st_id', 'trc', 'dir', 'nbr', 'nbr_2','nbr_3']

    >>>

       st_id      trc  dir  nbr  nbr_2  nbr_3
    0  88000  4009115    1    2      1      0
    1  88000  4009115    2    2      1      0
    2  88300  4009113    1    3      0      1
    3  88300  4009113    2    2      1      0
    4  88900  4009114    1    2      1      0
    5  88900  4009114    2    2      1      0

您可以根据需要查找与交叉表有关的列。

如果要对所有nbr = 2的行进行排序

然后您可以使用:

    df[df.nbr==2]

    >>>

       st_id      trc  dir  nbr
    0  88900  4009114    1    2
    1  88900  4009114    2    2
    2  88000  4009115    1    2
    3  88000  4009115    2    2
    5  88300  4009113    2    2

    df[df.nbr==3] 

...