在python中,按dataframe列中的每个值分组

2024-09-29 02:25:45 发布

您现在位置: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

我想为每个ID创建一个有4个元素的元组,这样每个元组元素代表每个ID(Bank Name, Number, Firstname, Lastname),这些元组元素的值是该ID的相应列中存在的不同元素的计数。 例如:对于ID = 12,元组应该是(2, 2, 2, 1),对于{},元组应该是{}

我可以通过执行以下操作来获取特定ID的所有行:

^{2}$

但是,我不知道如何对ID列中的每个值执行此操作(非常类似于SQL中的groupby子句,还可以获取count而不是行中的实际值。在

请帮忙。在


Tags: 数据nameid元素numberfirstnameb1元组
3条回答

我想你需要这个:

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

输出将是:

^{pr2}$

^{}^{}一起使用,lambda函数与^{}一起使用:

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

^{pr2}$

使用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

或者

^{pr2}$

或者,如果您希望作为数据帧而不是元组

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

相关问题 更多 >