python - 将元组列表转换为具有多级列的数据框
问题描述
我有一个要转换为数据框的命名元组列表。元组是这样的:
s = pd.Series({'A': 1, 'B': 2},
pd.Index([u'A', u'B'],
name=u'submission_label'))
SingleExperimentStatistics = namedtuple('SingleExperimentStatistics',
['metric_name', 'z_score', 'average'])
res = SingleExperimentStatistics(
metric_name=None,
z_score=1.1826795129064109,
average=s,
)
打电话pd.Dataframe([res, res])
给我们
metric_name z_score average
0 None 1.18268 submission_label A 1 B 2 dtype: int64
1 None 1.18268 submission_label A 1 B 2 dtype: int64
但我想要的是一个数据透视表,其中MultiIndex
列是列名。基本上,是这样的:A
B
metric_name z_score average
A B
0 None 1.18268 1 2
1 None 1.18268 1 2
这样做的正确方法是什么?
解决方案
我更喜欢通过将这些系列分成两列来使用简单的索引:
import pandas as pd
from collections import namedtuple
s = pd.Series({'A': 1, 'B': 2},
pd.Index([u'A', u'B'],
name=u'submission_label'))
SingleExperimentStatistics = namedtuple('SingleExperimentStatistics',
['metric_name', 'z_score', 'average'])
res = SingleExperimentStatistics(
metric_name=None,
z_score=1.1826795129064109,
average=s,
)
df = pd.DataFrame([res, res])
df1 = df.loc[:, ['metric_name', 'z_score']]
df1['A'] = df['average'].apply(lambda x: x['A'])
df1['B'] = df['average'].apply(lambda x: x['B'])
print(df1)
metric_name z_score A B
0 None 1.18268 1 2
1 None 1.18268 1 2
如果你真的想要多索引,你可以在这一步定义它:
index = pd.MultiIndex.from_tuples(zip(['metric_name', 'z_score', 'average', 'average'],
['' ,'', 'A', 'B']))
df1.columns = index
print(df1)
metric_name z_score average
A B
0 None 1.18268 1 2
1 None 1.18268 1 2
推荐阅读
- algorithm - 将 n 个值拆分为 m 个组时避免明显代价高昂组合的算法
- android - 调试适配器中未处理的错误:SyntaxError: 位置 0 处 JSON 中的意外标记 L
- vba - 需要帮助,VBA,停止来自另一个私人子的私人子事件
- cordova - 离子 InAppBrowser 显示 err_unknown_url_scheme
- javascript - 如何在 react native 或 JS 中解码特殊字符或 HTML 实体?
- python - Tensorflow While loop with Variable Creation
- android - Can HorizontalScrollView be disable on touchevent and accessible using button
- firebase - 如果应用程序关闭/滑动(React Native)收到通知时崩溃
- .htaccess - .htaccess 将 https 重定向到 http 网站未加载
- redis - 如何在Redis(Jedis)的hset中添加键的TTL值