2016-05-11 3 views
3

Пытается увидеть, как сложно или легко это сделать с Пандами.Pandas создает несколько агрегатов

Скажем, один имеет два столбца с данными, такими как:

Cat1 Cat2 
A  1 
A  2 
A  3 
B  1 
B  2 
C  1 
C  2 
C  3 
D  4 

Как вы видите A и C имеют три общие элементы 1, 2, 3. B однако имеет только два элемента 1 и 2. D имеет только один элемент: 4.

Как бы программно добраться до этого же результата. Идея будет состоять в том, чтобы каждая группа вернулась как-то. Таким образом, будет [A, C] и [1, 2, 3], затем [B] и [1, 2] и [D] с [4].

Я знаю, что программа может быть написана для этого, поэтому я пытаюсь выяснить, есть ли что-то в Пандах, чтобы сделать это, не создавая вещи с нуля.

Спасибо!

ответ

0

Вы можете также:

df = df.set_index('Cat1', append=True).unstack().loc[:, 'Cat2'] 
df = pd.Series({col: tuple(values.dropna()) for col, values in df.items()}) 
df = df.groupby(df.values).apply(lambda x: list(x.index)) 

получить

    Cat1 
(1.0, 2.0)   [B] 
(1.0, 2.0, 3.0) [A, C] 
(4.0,)    [D] 
3

Вы можете использовать groupby дважды, чтобы достичь этого.

df = df.groupby('Cat1')['Cat2'].apply(lambda x: tuple(set(x))).reset_index() 
df = df.groupby('Cat2')['Cat1'].apply(lambda x: tuple(set(x))).reset_index() 

Я использую tuple, потому что панды нужны элементы, чтобы быть hashable для того, чтобы сделать groupby. В приведенном выше коде не различаются (1, 2, 3) и (1, 1, 2, 3). Если вы хотите сделать это различие, замените set на sorted.

Полученный выход:

 Cat2 Cat1 
0  (1, 2) (B,) 
1 (1, 2, 3) (A, C) 
2  (4,) (D,) 
Смежные вопросы