python - 带有内部堆叠子表的 Pandas DataFrame 表
问题描述
假设我有以下来自数据库的输入数据。
data = [{'abc': 'None',
'cde': 4,
'efg': 1,
'blah': {'k': 23,
'y': 26,
'u':48}
},{'abc': 'hdf',
'cde':10,
'efg': 2,
'blah': {'k': 244,
'y': 747,
'u':75,
'g':88},
},
]
以下是我想要制作的 pandas 数据框的外观:
blah
cde abc g k u y
efg 1 4 'None' N/A 23 48 26
2 10 'hdf' 88 244 75 747
主要特点:
- 'efg' 被垂直合并并充当索引(我想,如果我错了,请纠正我)
- 'cde'、'abc' 等平面特征被视为普通列
- 嵌套 dict 将父级堆叠在其各自的子元素之上,任何没有与索引关联的值的嵌套字段,'efg' 获取 N/A。
尝试:当我将数据放入熊猫数据框中时,我得到以下信息:
abc cde efg blah
k None 4 1 23
u None 4 1 48
y None 4 1 26
g hdf 10 2 88
k hdf 10 2 244
u hdf 10 2 75
y hdf 10 2 747
我怀疑 pandas 将嵌套的 dict 键作为索引,所以我将其重置为以下内容:
index abc cde efg blah
0 k None 4 1 23
1 u None 4 1 48
2 y None 4 1 26
3 g hdf 10 2 88
4 k hdf 10 2 244
5 u hdf 10 2 75
6 y hdf 10 2 747
所以我通过 pandas 提供的“索引”列来旋转这个表,我希望它有一个堆叠的交叉表,其中“blah”父项作为最顶层的项目,子列是它的嵌套 dict ('k','u '、'y'、'g')。此外,我希望其他列保持完整,只有“blah”部分具有合并的单元格。但是,我们得到了这个:
>>> t_pivot = t_concat.pivot_table(columns='index')
>>> t_pivot
index g k u y
blah 88.0 133.5 61.5 386.5
cde 10.0 7.0 7.0 7.0
efg 2.0 1.5 1.5 1.5
好吧不是很好,所以也许我需要明确说明我们应该索引哪些数据:
t_pivot = t_concat.pivot_table(index = 'efg',columns=['index', 'cde'])
>>> t_pivot
blah
index g k u y
cde 10 4 10 4 10 4 10
efg
1 NaN 23.0 NaN 48.0 NaN 26.0 NaN
2 88.0 NaN 244.0 NaN 75.0 NaN 747.0
还是不对。
那么关于如何从具有嵌套字典的字典形成数据框的任何想法?主要使单元格为父元素及其各自的子元素正确合并。最终结果将进入一个 html 文档。
我尝试过的其他事情: - 将内部 dict 键变成元组 - 使用 stack() 方法,但似乎无法得到任何看起来正确的东西
解决方案
df = pd.DataFrame(data).set_index('efg')
sub_df = df.blah.apply(pd.Series)
sub_df = pd.concat({'blah': sub_df}, axis=1, names=['l1', 'l2'])
df = pd.concat({'': df}, axis=1, names=['l1', 'l2'])
df = pd.concat((df, sub_df), axis=1)
df = df.drop(('', 'blah'), axis=1)
print df
l1 blah
l2 abc cde g k u y
efg
1 None 4 NaN 23.0 48.0 26.0
2 hdf 10 88.0 244.0 75.0 747.0
分层列解决方案基于此答案。
推荐阅读
- php - 为什么我发送的邮件会在这个表单中命名?
- php - 安装失败,正在将 ./composer.json 和 ./composer.lock 还原为其原始内容
- windows - 如何将凭据添加到注册表并在 Powershell 脚本中使用它们
- npm - 无法发布 npm 包(E403:禁止)
- video-streaming - webrtc重新协商的向下兼容性
- python-3.x - 没有参数的 Depends 有什么作用?
- c# - docfx 元数据步骤失败并出现错误“无法加载 SDK 解析器”
- jupyter-notebook - 为什么会出现错误,例如 SageMath 中没有名为 sagenb 的模块?
- mysql - 我的 liquibase 更新日志有什么问题?
- python - 遍历包含 2 个值的列表,将它们保存到变量中