python - 数据框按嵌套字典中的路径分组
问题描述
DataFrame 的 groupby 支持按表中的列列表进行分组,例如:
from pandas import DataFrame as DF
data2 = [{'a':{'x':1,'y':2},'b':2, 'x0':1},{'a':{'x':3,'y':4},'b':4, 'x0':3},{'a':{'x':1,'y':6},'b':6, 'x0':1}]
(为了说明,请注意“x0”列与嵌套字典中的“x”重复)
这按预期工作:
DF(data2).groupby(['x0','b']).size().unstack()
如何模仿这种行为来代替嵌套'x'
的'x0'
?
我尝试了一种lambda
用于输出元组的方法:
DF(data2).groupby(lambda i: (data2[i]['a']['x'],data2[i]['b'])).size()
(1, 2) 1
(1, 6) 1
(3, 4) 1
dtype: int64
wheredata2[i]['x0']
也可以作为第一个元组元素。在这两种情况下都会unstack
抛出:
AttributeError: 'Index' object has no attribute 'remove_unused_levels'
所以列/字典键名没有正确处理。是否有就地解决方法,即不设置新变量或数据帧?
解决方案
我想如果你想使用 alambda expression
你可以,但它不会比你的第一种方法更快:
df = pd.DataFrame(data2).groupby(lambda i: (data2[i]['a']['x'],data2[i]['b'])).size()
# create a multiindex which will allow yo to use unstack
df.index = pd.MultiIndex.from_tuples(df.index, names=['x0', 'b'])
df.unstack(level=1)
b 2 4 6
x0
1 1.0 NaN 1.0
3 NaN 1.0 NaN
推荐阅读
- c++ - int32_t 到 uint64_t 转换的顺序
- javascript - 如何使用 javascript prompt() 方法实现 3 次尝试登录表单。它会在第二次尝试后检查下一次
- c++ - 将指向函数的指针从类转换为普通指针的问题
- angular - *ngFor 中的 Angular 复选框
- excel - 使用宏计算条件格式单元格的数量
- php - laravel 中是否有任何配置可以在堆栈跟踪期间禁用函数参数日志记录?
- python - 使用 Python Selenium 追溯 SSL 错误和不可点击的项目
- php - PHP API 调用适用于本地主机、邮递员但不适用于实时网站
- php - php explode 和 foreach 只返回一个循环
- typescript - TypeScript 编译器 API 的“模块解析缓存”应该如何使用?