首页 > 解决方案 > Python group by 正在创建列表列表而不是单个列表

问题描述

我有这个数据框:

data = pd.DataFrame({'UserName':['LoveLearn','JakeSanz','LoveLearn'],'Alias':['LL','JS','LL'],'ClassRoom1':['A2','3B','C2'],'ClassRoom2':['B5','E6','D2'],'Points':[1,6,2]})

我想按用户名、别名进行分组并对分数求和(完成)并获取用户参加过的所有教室的列表。

首先,我按名称过滤 classrom 列:

classroom_columns = list(data.filter(regex='ClassRoom*').columns)

我对数据进行分组:

grouped_data = data.groupby(['UserName','Alias'])

定义这个函数:

def group_metrics(g_df,class_cols):
    return pd.DataFrame({'TotalPoints':g_df['Points'].sum(),'TotalClassRooms':g_df.apply(lambda x: x[class_cols].values.tolist())})

但是在调用函数之后

group_metrics(grouped_data,classroom_columns)

我得到了 TotalClassRooms 上的列表:

    UserName Alias  TotalPoints       TotalClassRooms
0   JakeSanz    JS            6            [[3B, E6]]
1  LoveLearn    LL            3  [[A2, B5], [C2, D2]]

我想要一个列表。

标签: pythonpandas

解决方案


可以使用np.ravelbeforetolist将 DataFrame 扁平化为 1D:

import numpy as np


def group_metrics(g_df, class_cols):
    return pd.DataFrame({
        'TotalPoints': g_df['Points'].sum(),
        'TotalClassRooms': g_df.apply(
            lambda x: np.ravel(x[class_cols]).tolist())
    })

或者flatten

def group_metrics(g_df, class_cols):
    return pd.DataFrame({
        'TotalPoints': g_df['Points'].sum(),
        'TotalClassRooms': g_df.apply(
            lambda x: x[class_cols].values.flatten().tolist())
    })

group_metrics(grouped_data, classroom_columns)
                 TotalPoints   TotalClassRooms
UserName  Alias                               
JakeSanz  JS               6          [3B, E6]
LoveLearn LL               3  [A2, B5, C2, D2]

推荐阅读