【问题标题】:Melt four (or more) pandas dataframe columns into two rows将四个(或更多)熊猫数据框列融化成两行
【发布时间】:2023-02-05 16:38:13
【问题描述】:

我正在尝试转换 dataframe 的结构:

ID ID2 ID3 R_u L_u R_sd L_sd
1  F   G1   x   y   z    t
2  M   G2   x   y   z    t

进入

ID ID2 ID3 Side u sd
1  F   G1   R    x z
1  F   G1   L    y t 
2  M   G2   R    x z
2  M   G2   L    y t 

我使用了pandas.melt函数

df_melt = df(id_vars=[('ID')], value_vars=['R_u', 'L_u'], 
                                  var_name='Side', value_name = 'u')

但我找不到同时处理超过四列或六列的方法。我想我可以从 melt 开始,然后使用 lambda 填充每一行,但我觉得我可以自动执行此操作。

请问有什么可能的解决方案吗?

【问题讨论】:

    标签: python python-3.x pandas dataframe pandas-melt


    【解决方案1】:

    janitorpivot_longer的良好用例:

    # pip install janitor
    import janitor
    
    cols = list(df.filter(like='ID'))
    # ['ID', 'ID2', 'ID3']
    
    out = df.pivot_longer(index=cols, names_to=['Side', '.value'], names_sep='_')
    

    输出:

       ID ID2 ID3 Side  u sd
    0   1   F  G1    R  x  z
    1   2   M  G2    R  x  z
    2   1   F  G1    L  y  t
    3   2   M  G2    L  y  t
    

    【讨论】:

      【解决方案2】:

      将ID列设置为索引然后拆分扩展剩余的列转换为多索引然后堆叠多索引的0级以重塑

      s = df.set_index('ID')
      s.columns = s.columns.str.split('_', expand=True)
      s = s.stack(0)
      

      wide_to_long 的替代方法

      pd.wide_to_long(df, i='ID', j='Side', stubnames=['R', 'L'], sep='_', suffix='w+').stack().unstack(-2)
      

      结果

           sd  u
      ID        
      1  L  t  y
         R  z  x
      2  L  t  y
         R  z  x
      

      【讨论】:

      • 啊,这是一个很好的解决方案,但如果我有多个 ID 列则不起作用——我将编辑我的问题
      • 如果您有多个 id 列,那么您可以相应地设置索引。例如df.set_index(['col1', 'col2', ...])
      猜你喜欢
      • 2023-02-06
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      相关资源
      最近更新 更多