簡體   English   中英

按python中數據框的列中的每個值進行分組

[英]Grouping by each value in a column of a dataframe in python

我有一個包含7列的數據框,如下所示:

Bank Name | Number | Firstname | Lastname | ID | Date1    | Date2
B1        | 1      | ABC       | EFG      | 12 | Somedate | Somedate
B2        | 2      | ABC       | EFG      | 12 | Somedate | Somedate
B1        | 1      | DEF       | EFG      | 12 | Somedate | Somedate
B3        | 3      | ABC       | GHI      | 13 | Somedate | Somedate
B4        | 4      | XYZ       | FHJ      | 13 | Somedate | Somedate
B5        | 5      | XYZ       | DFI      | 13 | Somedate | Somedate

我想創建與4個元素的每個的元組ID ,使得每個元組元素表示(Bank Name, Number, Firstname, Lastname)對於每個ID和這些元組的元素的值是不同的元素的存在於各自的計數該ID的列。 例如:對於ID = 12 ,元組應為(2, 2, 2, 1) 2,2,2,1 (2, 2, 2, 1) ,對於ID=13,元組應為(3, 3, 2, 3) 3,3,2,3 (3, 3, 2, 3)

通過執行以下操作,我可以獲取特定ID的所有行:

print(df.loc[df['ID'] == '12'])

但是,我不知道如何為ID列中的每個值執行此操作(非常類似於SQL中的group by子句,並且還獲取計數而不是行中的實際值。

請幫忙。

使用apply你可以做到

In [117]: cols = ['BankName', 'Number', 'Firstname', 'Lastname']

In [126]: df.groupby('ID')[cols].nunique().apply(tuple, axis=1)
Out[126]:
ID
12    (2, 2, 2, 1)
13    (3, 3, 2, 3)
dtype: object

要么,

In [127]: df.groupby('ID').apply(lambda x: tuple(x[c].nunique() for c in cols))
Out[127]:
ID
12    (2, 2, 2, 1)
13    (3, 3, 2, 3)
dtype: object

或者,如果您想要數據幀而不是元組

In [122]: df.groupby('ID').agg({c: 'nunique' for c in cols})
Out[122]:
    Lastname  Number  Firstname  BankName
ID
12         1       2          2         2
13         3       3          2         3

or,

In [123]: df.groupby('ID')[cols].nunique()
Out[123]:
    BankName  Number  Firstname  Lastname
ID
12         2       2          2         1
13         3       3          2         3

使用groupbyapply和lambda函數nunique

cols = ['Bank Name', 'Number', 'Firstname', 'Lastname']
df = df.groupby('ID')[cols].apply(lambda x: tuple(x.nunique()))
print (df)
ID
12    (2, 2, 2, 1)
13    (3, 3, 2, 3)
dtype: object

如果有必要轉換為dict

d = df.groupby('ID')[cols].apply(lambda x: tuple(x.nunique())).to_dict()
print (d)
{12: (2, 2, 2, 1), 13: (3, 3, 2, 3)}

我想你需要這個:

group = df.groupby('ID')['Bank Name','Number','Firstname','Lastname'].nunique()
group['tuples'] = group.apply(lambda x: tuple(x), axis=1)
group.loc[:,'tuples']

輸出將是:

ID
12    (2, 2, 2, 1)
13    (3, 3, 2, 3)
Name: tuples, dtype: object

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM