熊猫数据框重新排列堆栈到两个值列(用于因子图)

Posted

技术标签:

【中文标题】熊猫数据框重新排列堆栈到两个值列(用于因子图)【英文标题】:Pandas dataframe rearrangement stack to two value columns (for factorplots) 【发布时间】:2017-02-16 12:01:18 【问题描述】:

我一直在尝试重新排列我的数据框以将其用作因子图的输入。原始数据如下所示:

  A B C  D
1 0 1 2 "T"
2 1 2 3 "F"
3 2 1 0 "F"
4 1 0 2 "T"
...

我的问题是如何将其重新排列成这种形式:

  col val val2
1  A   0  "T"
1  B   1  "T"
1  C   2  "T"
2  A   1  "F"
...

我在尝试:

df = DF.cumsum(axis=0).stack().reset_index(name="val")

但是这只会产生一个值列而不是两个.. 感谢您的支持

【问题讨论】:

您想对这些值执行cumsum,然后根据您想要的DF 重新调整它,或者只是在不执行cumsum 操作的情况下重新调整这些值,因为您已经得到了后一种情况? 【参考方案1】:

我会用melt,你可以随意排序

pd.melt(df.reset_index(),id_vars=['index','D'], value_vars=['A','B','C']).sort_values(by='index')
Out[40]: 
    index  D variable  value
0       1  T        A      0
4       1  T        B      1
8       1  T        C      2
1       2  F        A      1
5       2  F        B      2
9       2  F        C      3
2       3  F        A      2
6       3  F        B      1
10      3  F        C      0
3       4  T        A      1
7       4  T        B      0
11      4  T        C      2

那么显然你可以随意命名列

df.set_index('index').rename(columns='D': 'col', 'variable': 'val2', 'value': 'val')

【讨论】:

比我的答案好几个数量级 @piRsquared 感谢您的来信!【参考方案2】:

考虑你的数据框df

df = pd.DataFrame([
        [0, 1, 2, 'T'],
        [1, 2, 3, 'F'],
        [2, 1, 3, 'F'],
        [1, 0, 2, 'T'],
    ], [1, 2, 3, 4], list('ABCD'))

解决方案

df.set_index('D', append=True) \
    .rename_axis(['col'], 1) \
    .rename_axis([None, 'val2']) \
    .stack().to_frame('val') \
    .reset_index(['col', 'val2']) \
    [['col', 'val', 'val2']]

【讨论】:

以上是关于熊猫数据框重新排列堆栈到两个值列(用于因子图)的主要内容,如果未能解决你的问题,请参考以下文章

连接两个熊猫数据框并重新排序列

重新排序数据框中的因子水平[重复]

如何从ggplot2中的两个不同的二进制值列绘制百分比堆积条形图?

熊猫对多个数据框求和

将两个熊猫数据框组合在一起Python [重复]

具有两个以上数据框的熊猫的外部合并[重复]