【问题标题】:Long to Wide DataFrame in Pandas With Pivot Column Name in New ColumnsPandas 中从长到宽的 DataFrame,在新列中具有枢轴列名称
【发布时间】:2022-04-04 10:30:15
【问题描述】:

我已经搜索了很多,但似乎找不到针对我的特定问题的枢轴功能线的东西。我将传达一个我正在寻找的简单示例:

长桌

dependent_variable  step a  b
         5.5          1  20 30
         5.5          2  25 37
         6.1          1  22 19
         6.1          2  18 29

想要的宽桌

dependent_variable   a_step1 a_step2 b_step1  b_step2
         5.5            20       25      30       37
         6.1            22       18      19       29

实际上,我想以 Step 列为中心,并使其余自变量(在本例中为 a 和 b)的列名包括步骤编号和与之关联的 a/b 值。

一旦旋转,我将使用因变量列并作为 numpy 数组和新旋转的因变量输入各种机器学习算法。

当我尝试 piRSquared 的建议时(谢谢),我得到了错误:索引包含重复的条目,无法重塑。

然后我尝试了(来自Here

d1 =data.set_index(['dependent_variable','step'], append=True).unstack()
d1.columns = d1.columns.map(lambda x: '{}_step{}'.format(*x))
d1.reset_index(inplace=True)

并且(使用示例表)得到以下结果:

level_0   dependent_variable a_step1 a_step2 b_step1 b_step2
  1               5.5           20      NaN    30       NaN
  2               5.5           NaN     25     NaN      37
  3               6.1           22      NaN    19       NaN
  4               6.1           NaN     18     NaN      29

所以,我还是少了一步

【问题讨论】:

  • 别人可能明白你在追求什么,但我不明白。我继续尝试回答这个问题,除非你能更好地展示你拥有的东西、你想要的东西以及你尝试过的东西。我会猜测其他人可能会有类似的感觉。阅读 MCVEHowToAskGoodQuestions,以更好地了解如何最大限度地提高问题得到解答的机会。
  • 感谢您的反馈,新版本是否更有意义?
  • @chemneach,已经有一段时间了,希望你还知道。您究竟是如何解决整个表格中的NaN 的?我尝试了这篇文章中的所有解决方案,但我无法修复它。可能是命令或命令错误或类似的东西。

标签: python-2.7 pandas


【解决方案1】:

假设您的数据框的名称是 dfdependent_variablestep 尚未在索引中

d1 = df.set_index(['dependent_variable', 'step']).unstack()
d1.columns = d1.columns.map(lambda x: '{}_step{}'.format(*x))
d1.reset_index(inplace=True)

print(d1)

   dependent_variable  a_step1  a_step2  b_step1  b_step2
0                 5.5       20       25       30       37
1                 6.1       22       18       19       29

【讨论】:

  • 感谢 piRSquared,它很接近。请参阅上面已编辑的问题。
【解决方案2】:

看起来你正在寻找 pd.pivot

"如果省略了 values 参数,并且输入 DataFrame 有不止一列的值,这些值不用作要透视的列或索引输入,则生成的“透视”DataFrame 将具有分层列,其最顶层指示相应的值列-https://pandas.pydata.org/pandas-docs/stable/reshaping.html。”

df = pd.DataFrame({'dependent_variable':[5.5,5.5,6.1,6.1],
          'step':[1,2,1,2],
          'a':[20,25,22,18],
          'b':[30,37,19,29],
         })
df = df.pivot(index='dependent_variable',
     columns='step')

产量

        a       b
step    1   2   1   2
dependent_variable              
5.5     20  25  30  37
6.1     22  18  19  29

它有一个分层索引,这可能比您指定的输出更有帮助。但是,您可以通过

更改为单列索引
df.columns = df.columns.tolist()

列没有您想要的确切名称,但您可以重命名。

【讨论】:

    【解决方案3】:

    请注意,如果您的索引和列组合重复,则下面首选的解决方案将不起作用,因为它在内部依赖于 pd.pivot,它在重复索引/列组合时失败。

    一种选择是使用pyjanitor 中的pivot_wider,使用names_glue 参数来重塑列名:

    # currently in dev
    # pip install git+https://github.com/pyjanitor-devs/pyjanitor.git
    import pandas as pd
    import janitor
    
    df.pivot_wider(
        index = 'dependent_variable', 
        names_from = 'step', 
        values_from = ['a', 'b'],
        names_glue = "{_value}_step{step}"
      )
    
       dependent_variable  a_step1  a_step2  b_step1  b_step2
    0                 5.5       20       25       30       37
    1                 6.1       22       18       19       29
    

    在 names_glue 字符串模板中,_value 用作来自values_from 的值的占位符,它们是ab{} 括号中的任何内容都应来自 names_from_value 以表示 values_from

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 2017-08-14
      • 2020-08-14
      • 2012-09-23
      • 2019-11-13
      • 2018-08-28
      相关资源
      最近更新 更多