Группировка по каждому значению в столбце данных в 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 = 12Кортеж должен быть (2, 2, 2, 1) и для ID=13, кортеж должен быть (3, 3, 2, 3)

Я могу получить все строки для определенного идентификатора, выполнив следующие действия:

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

Но я не знаю, как это сделать для каждого значения в столбце идентификатора (очень похоже на предложение group by в SQL, а также получить счетчик вместо фактических значений в строках).

Пожалуйста помоги.

3 ответа

Решение

С помощью 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

Или, если вы хотите в качестве dataframe вместо кортежа

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 с apply и лямбда-функция с 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
Другие вопросы по тегам