代码之家  ›  专栏  ›  技术社区  ›  daiyue

numpy unique无法筛选出特定列上具有相同值的组

  •  2
  • daiyue  · 技术社区  · 8 年前

    我试着 groupby A. df 然后选择在特定列上的值不相同且组大小>;1.

    df.groupby(['account_no', 'ext_id', 'amount']).filter(lambda x: (len(x) > 1) & (np.unique(x.int_id).size != 1))
    

    这个 df公司 看起来,请注意 account_no 字符串只有一个空格, ext_id int_id 也是字符串, amount float ;

    account_no    ext_id    amount        int_id
                  2665057   439.504062     D000192
                  2665057   439.504062     D000192
                  353724    2758.92        952
                  353724    2758.92        952
    

    应该返回空 df公司 ,因为样本中没有一行满足此处的条件,但 int_id = 292 仍然存在,因此如何解决此问题。

    附言 numpy 1.14.3 ,则, pandas 0.22.0 ,则, python 3.5.2

    1 回复  |  直到 8 年前
        1
  •  1
  •   jezrael    8 年前

    在我看来,有一些traling空格或类似的问题。

    您可以检查:

    df = pd.DataFrame({'account_no': ['a', 'a', 'a', 'a'], 
                       'ext_id': [2665057, 2665057, 353724, 353724], 
                       'amount': [439.50406200000003, 439.50406200000003, 2758.92, 2758.92], 
                       'int_id': ['D000192', 'D000192', ' 952', '952']})
    print (df)
      account_no       amount   ext_id   int_id
    0          a   439.504062  2665057  D000192
    1          a   439.504062  2665057  D000192
    2          a  2758.920000   353724      952
    3          a  2758.920000   353724      952
    
    df1 = df.groupby(['account_no', 'ext_id', 'amount']).filter(lambda x: (len(x) > 1) & (np.unique(x.int_id).size != 1))
    print (df1)
      account_no   amount  ext_id int_id
    2          a  2758.92  353724    952
    3          a  2758.92  353724    952
    
    print (df1['int_id'].tolist())
    [' 952', '952']
    

    然后通过 str.strip :

    df['int_id'] = df['int_id'].str.strip()
    df1 = df.groupby(['account_no', 'ext_id', 'amount']).filter(lambda x: (len(x) > 1) & (np.unique(x.int_id).size != 1))
    print (df1)
    Empty DataFrame
    Columns: [account_no, amount, ext_id, int_id]
    Index: []