在pandas数据框中将行重塑为列

7
在 Pandas 中,如何从以下数据进行操作:
a = pd.DataFrame({'foo': ['m', 'm', 'm', 's', 's', 's'],
                    'bar': [1, 2, 3, 4, 5, 6]})
>>> a
   bar foo
0    1   m
1    2   m
2    3   m
3    4   s
4    5   s
5    6   s

致 b:

b = pd.DataFrame({'m': [1, 2, 3],
                    's': [4, 5, 6]})
>>> b
   m  s
0  1  4
1  2  5
2  3  6

我尝试了其他答案中的解决方案,例如这里这里,但似乎都不能做到我想要的。

基本上,我想要交换行和列并且删除索引,但是该如何实现呢?

2个回答

6
a.set_index(
    [a.groupby('foo').cumcount(), 'foo']
).bar.unstack()

你能详细说明一下发生了什么吗?我查看了GroupBy.cumcount()的文档,但是有些晦涩难懂。 - PedroA
1
非常抱歉细节不够清楚,我正在使用手机。您目前所拥有的信息问题在于需要区分具有相同foo值的不同数值。Cumcount通过为前三个创建0、1和2来完美解决这个问题,并对后三个使用相同的方法。更重要的是,即使它们的大小不都是3,也能正常工作。鉴于我所设置的索引位置,这样布局非常适合进行unstack操作。 - piRSquared

4
这是我的解决方案。
a = pd.DataFrame({'foo': ['m', 'm', 'm', 's', 's', 's'],
                    'bar': [1, 2, 3, 4, 5, 6]})
a.pivot(columns='foo', values='bar').apply(lambda x: pd.Series(x.dropna().values))

foo    m    s
0    1.0  4.0
1    2.0  5.0
2    3.0  6.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接