按 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
我想为每个 ID
创建一个包含 4 个元素的元组,这样每个元组元素代表每个 ID
的 (Bank Name, Number, Firstname, Lastname)
并且这些元组元素的值是计数该 ID 的相应列中存在的不同元素的数量。
例如:对于 ID = 12
,元组应为 (2, 2, 2, 1)
,对于 ID=13,
,元组应为 (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
使用groupby
with apply
and lambda function with 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
我有一个包含 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=13,
,元组应为 (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
使用groupby
with apply
and lambda function with 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