数据框的基于行的过滤器

时间:2018-06-27 18:00:43

标签: python python-3.x pandas dataframe

我想对数据框执行分析。 这是我的数据框格式。

df_Input = pd.read_excel(“ / home / cc / Downloads / date.xlsx”)

ID    | BOOK |  Type
-----------------------     
1     | ABC  |   MAR
45    | PQR  |   TAB
45    | EDF  |   Fin
1     | DCF  |   oop
45    | PQR  |   TAB

我想找到计数(每个唯一值的计数)和每个唯一ID可以保存的唯一值。输出应为如下所示的数据框。

ID  |  BOOK_Count | Book_values  |Type_count |  Type_values
-----------------------------------------------------------
1   |    2        |  [ABC,DCF]   | 1         |    [MAR,oop]
45  |    2        |  [PQR,EDF]   | 2         |    [Fin,TAB]

我尝试这样做,但是有很多循环。预先感谢

2 个答案:

答案 0 :(得分:1)

IIUC,您可以使用:

df_out = df.groupby('ID')['BOOK','Type'].agg(['nunique', lambda x: list(set(x))])
df_out = df_out.rename(columns={'nunique':'count', '<lambda>':'values'})
df_out.columns = df_out.columns.map('_'.join)
print(df_out)

输出:

      BOOK_count BOOK_values  Type_count Type_values
ID                                                  
1_1            2  [ABC, DCF]           2  [MAR, oop]
45_2           2  [EDF, PQR]           2  [TAB, Fin]

答案 1 :(得分:0)

假设我们有这个数据框:

    ID  BOOK type
0   1   ABC  MAR
1   0   PQR  TAB
2   1   EDF  Fin
3   0   DCF  oop
4   1   PQR  TAB

您可以使用json聚合格式,如下所示:

aggreg = {
'BOOK':{
    'BOOK_COUNT' : len,
    'BOOK_values' : lambda r : r.tolist()
},

'type':{
    'Type_COUNT' : len,
    'Type_values' : lambda r : r.tolist()
} 
}

然后,使用groupby

df.groupby('ID').agg(aggreg)

#output :
          BOOK              type
    BOOK_COUNT  BOOK_values Type_COUNT  Type_values
ID              
0            2    [PQR, DCF]        2   [TAB, oop]
1            3    [ABC, EDF, PQR]   3   [MAR, Fin, TAB]