Python 熊猫:在多索引数据帧中折叠行
以下是我的df:Python 熊猫:在多索引数据帧中折叠行,python,python-3.x,pandas,dataframe,multi-index,Python,Python 3.x,Pandas,Dataframe,Multi Index,以下是我的df: df = pd.DataFrame({'A': [1, 1, 1, 2], 'B': [2, 2, 2, 3], 'C': [3, 3, 3, 4], 'D': ['Cancer A', 'Cancer B', 'Cancer A', 'Cancer B'], 'E': ['Eco
df = pd.DataFrame({'A': [1, 1, 1, 2],
'B': [2, 2, 2, 3],
'C': [3, 3, 3, 4],
'D': ['Cancer A', 'Cancer B', 'Cancer A', 'Cancer B'],
'E': ['Ecog 9', 'Ecog 1', 'Ecog 0', 'Ecog 1'],
'F': ['val 6', 'val 1', 'val 0', 'val 1'],
'measure_m': [100, 200, 500, 300]})
print(df)
A B C D E F measure_m
0 1 2 3 Cancer A Ecog 9 val 6 100
1 1 2 3 Cancer B Ecog 1 val 1 200
2 1 2 3 Cancer A Ecog 0 val 0 500
3 2 3 4 Cancer B Ecog 1 val 1 300
当我pivot
这个df没有通过索引时,我得到:
In [1280]: df.pivot(index=None, columns = ['A', 'B', 'C', 'D', 'E', 'F'])
Out[1280]:
measure_m
A 1 2
B 2 3
C 3 4
D Cancer A Cancer B Cancer A Cancer B
E Ecog 9 Ecog 1 Ecog 0 Ecog 1
F val 6 val 1 val 0 val 1
0 100.0 NaN NaN NaN
1 NaN 200.0 NaN NaN
2 NaN NaN 500.0 NaN
3 NaN NaN NaN 300.0
我想要的不是4行
而是1
一行,包含measure\m
列的所有值,如下所示:
measure_m
A 1 2
B 2 3
C 3 4
D Cancer A Cancer B Cancer A Cancer B
E Ecog 9 Ecog 1 Ecog 0 Ecog 1
F val 6 val 1 val 0 val 1
0 100.0 200.0 500.0 300.0
怎么做?你的意思是:
df.set_index(list(df.columns[:-1])).T
输出:
A 1 2
B 2 3
C 3 4
D Cancer A Cancer B Cancer A Cancer B
E Ecog 9 Ecog 1 Ecog 0 Ecog 1
F val 6 val 1 val 0 val 1
measure_m 100 200 500 300
measure_m
A 1 2
B 2 3
C 3 4
D Cancer A Cancer B Cancer A Cancer B
E Ecog 9 Ecog 1 Ecog 0 Ecog 1
F val 6 val 1 val 0 val 1
0 100 200 500 300
更新稍作修改以匹配您的输出:
cols = ['A', 'B', 'C', 'D', 'E', 'F']
(df.set_index(cols)
[['measure_m']] # only need this if you have more columns
.unstack(level=cols)
.to_frame().T
)
输出:
A 1 2
B 2 3
C 3 4
D Cancer A Cancer B Cancer A Cancer B
E Ecog 9 Ecog 1 Ecog 0 Ecog 1
F val 6 val 1 val 0 val 1
measure_m 100 200 500 300
measure_m
A 1 2
B 2 3
C 3 4
D Cancer A Cancer B Cancer A Cancer B
E Ecog 9 Ecog 1 Ecog 0 Ecog 1
F val 6 val 1 val 0 val 1
0 100 200 500 300
这里唯一的一点是,
T
在处理大型数据帧时成本有点高。还有什么可以做的吗?T
除了复制数据外,成本并没有那么高。例如,它比pivot
,unstack
,甚至set\u index
的成本要低得多。如果不需要水平格式,可以删除T
。除此之外,我不确定是否有更好的方法。好的,这是有意义的。谢谢。您的第二个解决方案失败了,错误:ValueError:Length mismatch:Expected axis有4个元素,新的值有2个元素
。不确定为什么,它当前可以处理示例数据和cols=['A',B',C',D',E',F']
。此格式的目的是什么?你需要它做模型还是做演示?只是好奇是的,我需要把这个发送到用户界面。