python - 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]]
我想要一个列表。
解决方案
可以使用np.ravel
beforetolist
将 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]
推荐阅读
- node.js - 节点中的 OTP 验证
- powershell - 尝试编译 DSC 配置时找不到模块“cChocoInstaller”
- google-apps-script - 使用过滤脚本 gs 复制到另一张工作表
- .net - 使用 WebApplicationFactory,在 Program.cs 执行之前添加配置源
- ssas - SSAS 表格模型中高级行级安全性的最佳实践是什么?
- pandas - `pandas.DataFrame.hist` 中会发生什么?
- spark-structured-streaming - 为什么在 Apache Spark Structured Streaming 控制台接收器在更新输出模式下不起作用
- python - 循环回到 Python 中的特定行
- c++ - C++ 编译器(在多态中)如何知道指针的类型?
- linux - 等到驱动程序实例探测到