【问题标题】:Pandas DataFrame Wide to Long based on first column values基于第一列值的 Pandas DataFrame Wide to Long
【发布时间】:2021-06-29 08:27:39
【问题描述】:

我想转换以下宽格式的 Pandas DataFrame

df = pd.DataFrame([['A', '1', '2', '3'], ['B', '4', '5', '6'], ['C', '7', '8', '9']], columns=['ABC', 'def', 'ghi', 'jkl'])

df =
   ABC  def  ghi  jkl
0    A    1    2    3
1    B    4    5    6
2    C    7    8    9

转换为长格式,其中第一列中的值仍对应于小写列中的值。列名不能用作存根名称。新列的名称无关紧要,以后可以重命名。

输出应该是这样的:

df =
   0  1
0  A  1
1  A  2
2  A  3
3  B  4
4  B  5
5  B  6
6  C  7
7  C  8
8  C  9

我不确定如何最好和最有效地做到这一点。这可以用wide_to_long() 来完成吗?然后我不知道如何处理存根名称。最好的是可以在大桌子上使用的高效单线。

非常感谢!!

【问题讨论】:

    标签: python pandas dataframe transform


    【解决方案1】:

    使用DataFrame.meltDataFrame.sort_index 并删除variable 列:

    df1 = (df.melt("ABC", value_name='new', ignore_index=False)
              .sort_index(ignore_index=True)
              .drop('variable', axis=1)
             )
    print (df1)
      ABC new
    0   A   1
    1   A   2
    2   A   3
    3   B   4
    4   B   5
    5   B   6
    6   C   7
    7   C   8
    8   C   9
    

    如果需要更多动态解决方案,生成列名的第一个值:

    first = df.columns[0]
    df1 = (df.melt(first, value_name='new', ignore_index=False)
             .sort_index(ignore_index=True)
             .drop('variable', axis=1))
    

    【讨论】:

    • 你认为这是dupe 吗?
    • @Umar.H - 几乎没有删除列variable
    • 非常感谢!但是,如果我相信 ABC 列中有重复值,df.melt 不一定会保留顺序。
    • @Fhtsm - 答案由sort_index 编辑,而不是sort_values
    • @Fhtsm - 以及 ignore_index=False 添加到 melt
    【解决方案2】:

    你可以使用df.stack:

    >>> df.set_index('ABC') \
          .stack() \
          .reset_index(level='ABC') \
          .reset_index(drop=True)
    
      ABC  0
    0   A  1
    1   A  2
    2   A  3
    3   B  4
    4   B  5
    5   B  6
    6   C  7
    7   C  8
    8   C  9
    

    或按照@MustafaAydın 的建议使用df.melt

    >>> df.melt('ABC') \
          .sort_values('ABC') \
          .drop(columns='variable') \
          .reset_index(drop=True)
    
      ABC value
    0   A     1
    1   A     2
    2   A     3
    3   B     4
    4   B     5
    5   B     6
    6   C     7
    7   C     8
    8   C     9
    

    【讨论】:

    • 非常感谢! df.stack 效果很好(保持列的顺序)。如果我相信 ABC 列中有重复值,df.melt 不一定会保留顺序。
    猜你喜欢
    • 2017-05-02
    • 2022-11-01
    • 1970-01-01
    • 2021-12-08
    • 2015-11-21
    • 2021-08-17
    • 2019-10-15
    • 1970-01-01
    • 2020-10-16
    相关资源
    最近更新 更多