【问题标题】:Python pandas: pivot certain variables in wide-form DataFramePython pandas:在宽格式DataFrame中旋转某些变量
【发布时间】:2017-08-08 03:32:17
【问题描述】:

数据修改问题:我如何有选择地从过宽的 DataFrame 中选择某些变量?

比如我想转:

df1 = pd.DataFrame(
    [[1,'a','b',.1,-1,10],
     [2,'a','b',.2,-3,12],
     [3,'c','d',.3,-5,14]],
    columns=['sample','id1','id2','x','y1','y2'])
print df1
#   sample id1 id2    x  y1  y2
#0       1   a   b  0.1  -1  10
#1       2   a   b  0.2  -3  12
#2       3   c   d  0.3  -5  14

进入:

#   sample id  position    x   y
#0       1  a         1  0.1  -1
#1       1  b         2  0.1  10
#2       2  a         1  0.2  -3
#3       2  b         2  0.2  12
#4       3  c         1  0.3  -5
#5       3  d         2  0.3  14

请注意,x 被复制,y 与位置对齐。

直接pd.melt() 创建混合变量和数据类型,这些变量和数据类型不容易有选择地转回宽格式。

print pd.melt(df1, id_vars='sample')
#    sample variable value
#0        1      id1     a
#1        2      id1     a
#2        3      id1     c
#3        1      id2     b
#4        2      id2     b
#5        3      id2     d
#6        1        x   0.1
#7        2        x   0.2
#8        3        x   0.3
#9        1       y1    -1
#10       2       y1    -3
#11       3       y1    -5
#12       1       y2    10
#13       2       y2    12
#14       3       y2    14

有什么建议吗?谢谢!

【问题讨论】:

    标签: python pandas pivot reshape data-munging


    【解决方案1】:

    你可以试试这个:

    # set columns that don't change as index
    df1.set_index(['sample', 'x'], inplace=True)
    
    # create multi-index columns based on the names pattern
    df1.columns = pd.MultiIndex.from_arrays(df1.columns.str.extract(r"(\D+)(\d+)", expand=True).T.values)
    
    # transform the multi-index data frames to long format with stack
    df1.stack(level=1).rename_axis(('sample', 'x', 'position')).reset_index()
    

    【讨论】:

    • 首先,很棒的答案。一个需要澄清的问题,因为 df.columns.str.extract() 对我来说是新的:如果列名更复杂,例如['id1, f22','id2, f22','var50_a1','var50_a2']。您是否只需要使用一些正则表达式来提取正确的变量名称/位置?
    • 我不认为正则表达式可以处理您轻松列出的混合模式列,它必须具有清晰的模式才能将其拆分为多索引,例如 a1, a2, b1, b2, c1, c2var1_a1, var1_a2, var2_a1, var2_a2 两者都应该没问题,对于后者但不混合,正则表达式应该是([^_]+)_([^_]+)。因此,确保您的列名不会发疯会有所帮助。
    • 酷,很容易在提取之前重命名列。
    猜你喜欢
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 2018-03-24
    • 2018-03-11
    相关资源
    最近更新 更多