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

通过值获取列表中可能有多个重复列的名称,这些值也可能包括缺少的值

  •  0
  • vasili111  · 技术社区  · 5 年前

    这个问题是继续: Get lists in list with names of duplicate columns by values

    我有数据帧:

    import pandas as pd
    import numpy as np
    
    #data = [[101, 1, 2, 10, 3, 2, 3, 1], [5,5, 5, 5, 5, 5, 5, 5], [30, 3, 7, 14, 10, 7, 10, 2], [11, 2, 6, 15, 20, 6, 20, 11]] 
    
    #df = pd.DataFrame(data, columns = ['xen', 'sim', 'tab', 'sim', 'simm', 'box', 'simm', 'res'])
    
    data = [[np.nan, 1, 2, 10, 3, 2, 2, 3, 1, np.nan, np.nan, np.nan, np.nan, np.nan, "a", "a", "a", "a"], 
            [5, 5, 5, 5, 5, 5, 5, 5, 5, np.nan, np.nan, np.nan, np.nan, np.nan, "sd", "sd", "sd", "sd"], 
            [30, 3, 7, 14, 10, 7, 7, 10, 2, np.nan, np.nan, np.nan, np.nan, np.nan, "wrt", "wrt", "wrt", "wrt"], 
            [11, 2, 6, 15, 9, 6, 6, 9, 11, np.nan, np.nan, np.nan, np.nan, np.nan, "r", "r", "r", "r"], 
            [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]] 
    
    df = pd.DataFrame(data, columns = ['xen', 'sim', 'tab', 'sim', 'simm', 'box', 'rex', 'simm', 'res', 'fen', 'zeb', 'zex', 'ser', 'ser', "asd", "bsd", "zar", "zar"])
    

    那个数据帧( df

    |   xen |   sim |   tab |   sim |   simm |   box |   rex |   simm |   res |   fen |   zeb |   zex |   ser |   ser | asd   | bsd   | zar   | zar   |
    |------:|------:|------:|------:|-------:|------:|------:|-------:|------:|------:|------:|------:|------:|------:|:------|:------|:------|:------|
    |   nan |     1 |     2 |    10 |      3 |     2 |     2 |      3 |     1 |   nan |   nan |   nan |   nan |   nan | a     | a     | a     | a     |
    |     5 |     5 |     5 |     5 |      5 |     5 |     5 |      5 |     5 |   nan |   nan |   nan |   nan |   nan | sd    | sd    | sd    | sd    |
    |    30 |     3 |     7 |    14 |     10 |     7 |     7 |     10 |     2 |   nan |   nan |   nan |   nan |   nan | wrt   | wrt   | wrt   | wrt   |
    |    11 |     2 |     6 |    15 |      9 |     6 |     6 |      9 |    11 |   nan |   nan |   nan |   nan |   nan | r     | r     | r     | r     |
    |   nan |   nan |   nan |   nan |    nan |   nan |   nan |    nan |   nan |   nan |   nan |   nan |   nan |   nan | nan   | nan   | nan   | nan   |
    

    [["tab", "box", "rex"], ["simm", "simm"], ["fen", "zeb", "zex", "ser", "ser"], ["asd", "bsd", "zar", "zar"]]
    
    0 回复  |  直到 5 年前
        1
  •  2
  •   sammywemmy    5 年前

    #find duplicate rows
    res = df.T.loc[df.T.duplicated(keep=False)]
    
    #replace null values with string
    #makes it easier later for grouping
    res = res.fillna('empty').reset_index().astype(str)
    
    #exclude the index column
    cols = res.columns[1:].tolist()
    
    res = res.set_index(cols)
    
    #groupby index to get pairings
    res.groupby(res.index).agg(list)['index'].tolist()
    
    [['tab', 'box', 'rex'],
     ['simm', 'simm'],
     ['asd', 'bsd', 'zar', 'zar'],
     ['fen', 'zeb', 'zex', 'ser', 'ser']]
    
        2
  •  1
  •   vasili111    5 年前

    df.T.fillna('nan').reset_index().groupby(df.index.tolist())['index'].agg(list).loc[lambda x : x.str.len()>=2].values.tolist()
    

    输出:

    [['tab', 'box', 'rex'], ['simm', 'simm'], ['asd', 'bsd', 'zar', 'zar'], ['fen', 'zeb', 'zex', 'ser', 'ser']]