如何使用 Pandas 从数据框中快速分组数据的多个特征

Wu *_*ris 2 python dataframe pandas

假设这是我的原始数据:

data = {'library_id': ['A123', 'A456','B123', 'A123', 'A123', 'B123', 'A456'],
     'school': ['A1','A', 'B', 'A', 'A2', 'B', 'A'],
     'charge ($)': [5.0, 10.0, 3.0, 2.5, 1.0, 4.0, 2.5], 
     'check_in_month': [12, 3, 4, 5, 4, 9, 5]}
library =pd.DataFrame(data)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我试图得到这个结果:

在此处输入图片说明

这是我获得结果的代码:

df = pd.DataFrame(library.library_id.value_counts())

school_list = []
for i in df.index:
    school_list.append(library[library.library_id == i].school.unique())
df['school'] = school_list
df  
Run Code Online (Sandbox Code Playgroud)

我的问题是如何避免使用列表(即 school_list = [])来获得相同的结果。因为当我有大数据时,使用列表将数据附加到数据框非常耗时。有没有其他更快的方法?

Mus*_*dın 5

你可以试试:

result = library.groupby("library_id").agg({"library_id": "size", "school": "unique"})
Run Code Online (Sandbox Code Playgroud)

要得到

            library_id       school
library_id
A123                 3  [A1, A, A2]
A456                 2          [A]
B123                 2          [B]
Run Code Online (Sandbox Code Playgroud)

我们按 分组library_id,然后agg对组sizeunique条目进行重新排序。

如果你不想library_id出现在索引的顶部,你可以写,result.index.name = None因为它是result.