У меня есть следующий фрейм данных my_df:

team      member
--------------------    
 A         Mary
 B         John
 C         Amy
 A         Dan
 B         Dave
 D         Paul
 B         Alex
 A         Mary
 D         Mary

Я хочу новый вывод нового фрейма данных new_df как:

team      members              number
--------------------------------------
 A       [Mary,Dan]              2
 B       [John,Dave,Alex]        3
 C       [Amy]                   1
 D       [Paul,Mary]             2

Мне интересно, есть ли какая-либо существующая функция панд, способная выполнить вышеуказанную задачу? Благодарность!

7
Edamame 11 Янв 2017 в 03:53

3 ответа

Лучший ответ

Используя groupby

< Сильный > < EM> { { X0 } }

g = df.groupby('team').member
pd.concat([g.apply(list), g.count()], axis=1, keys=['members', 'number'])

< Сильный > < EM> { { X0 } }

g = df.groupby('team').member
g.agg(dict(members=lambda x: list(x), number='count'))

                 members  number
team                            
A            [Mary, Dan]       2
B     [John, Dave, Alex]       3
C                  [Amy]       1
D                 [Paul]       1
6
piRSquared 11 Янв 2017 в 01:03

Еще один вариант здесь:

(df.groupby("team", as_index=False).member
   .agg({"member": lambda x: list(x), "count": "count"}))

enter image description here

3
Psidom 11 Янв 2017 в 01:05

Используя lambda:

newdf=pd.DataFrame()
newdf['team']=my_df['team'].unique()
newdf['members']=newdf['team'].map(lambda x:list(my_df[my_df['team']==x]['member']))
newdf['number']=newdf.members.map(lambda x: len(x))
newdf.set_index('team',inplace=True)
1
racket99 11 Янв 2017 в 01:12