【问题标题】:pandas dataframe reshaping/stacking of multiple value variables into seperate columns熊猫数据框将多个值变量重塑/堆叠成单独的列
【发布时间】:2015-11-13 08:03:05
【问题描述】:

您好,我正在尝试以某种方式重塑数据框。

这是我拥有的数据框,

         des1 des2 des3 interval1 interval2 interval3
value   
aaa       a    b    c     ##1         ##2       ##3
bbb       d    e    f     ##4         ##5       ##6
ccc       g    h    i     ##7         ##8       ##9

des1 对应于 interval1 等等。 interval 列有日期范围,des 列有描述。

我想重塑数据框,使其看起来像这样:

         des      interval
value   
aaa       a         ##1
aaa       b         ##2
aaa       c         ##3
bbb       d         ##4
bbb       e         ##5
bbb       f         ##6
ccc       g         ##7
ccc       h         ##8
ccc       i         ##9

我该怎么做呢?我对 .stack() 有点熟悉,但我无法得到我想要的东西。

感谢您的帮助。随时发布参考。

【问题讨论】:

  • 这是一个很好的问题,pandas.pydata.org/pandas-docs/stable/generated/pandas.melt.html 没有涵盖,因为它处理需要堆叠成两个单独列的多个列。也许标题应该反映“熊猫数据框将多个值变量重塑/堆叠成单独的列”-
  • 根据您的建议,我更改了标题。我希望人们从以下有用的答案中受益。

标签: python pandas


【解决方案1】:

这种类型的重塑可以通过pandas.wide_to_long方便地完成:

import io
import pandas as pd  # v 1.2.3

data = '''
value des1 des2 des3 interval1 interval2 interval3  
aaa  a  b  c ##1 ##2 ##3
bbb  d  e  f ##4 ##5 ##6
ccc  g  h  i ##7 ##8 ##9
'''
df = pd.read_csv(io.StringIO(data), index_col=0, delim_whitespace=True)

pd.wide_to_long(df.reset_index(), stubnames=['des', 'interval'],
                i='value', j='var_id').droplevel(1).sort_index()

【讨论】:

    【解决方案2】:

    我认为CT Zhu 提供的解决方案非常天才。但是你也可以一步一步地重塑这个(也许这是常见的方式)。

     d = {'des1' : ['', 'a', 'd', 'g'],
         'des2' : ['', 'b', 'e', 'h'],
         'des3' : ['', 'c', 'f', 'i'],
         'interval1' : ['', '##1', '##4', '##7'],
         'interval2' : ['', '##2', '##5', '##6'],
         'interval3' : ['', '##3', '##6', '##9']}
    
    df = pd.DataFrame(d, index=['value', 'aaa', 'bbb', 'ccc'], 
                      columns=['des1', 'des2', 'des3', 'interval1', 'interval2', 'interval3'])
    
    nd = {'des' : [''] + df.iloc[1, 0:3].tolist() + df.iloc[2, 0:3].tolist() + df.iloc[3, 0:3].tolist(),
          'interval' : ['']+ df.iloc[1, 3:6].tolist() + df.iloc[2, 3:6].tolist() + df.iloc[3, 3:6].tolist()}
    
    ndf = pd.DataFrame(nd, index=['value', 'aaa', 'aaa', 'aaa', 'bbb', 'bbb', 'bbb', 'ccc', 'ccc', 'ccc'], columns=['des', 'interval'])
    

    【讨论】:

      【解决方案3】:

      这可能是一种更短的方法:

      [72]:
      
      df.columns = pd.MultiIndex.from_tuples(map(lambda x: (x[:-1], x), df.columns))
      In [73]:
      
      print pd.DataFrame({key:df[key].stack().values for key in set(df.columns.get_level_values(0))},
                         index = df['des'].stack().index.get_level_values(0))
            des interval
      value             
      aaa     a      ##1
      aaa     b      ##2
      aaa     c      ##3
      bbb     d      ##4
      bbb     e      ##5
      bbb     f      ##6
      ccc     g      ##7
      ccc     h      ##8
      ccc     i      ##9
      

      或者保留1,2,3的信息:

      [73]:
      
      df.columns = pd.MultiIndex.from_tuples(map(lambda x: (x[:-1], x[-1]), df.columns))
      Keys = set(df.columns.get_level_values(0))
      df2  = pd.concat([df[key].stack() for key in Keys], axis=1)
      df2.columns = Keys
      print df2
              des interval
      value               
      aaa   1   a      ##1
            2   b      ##2
            3   c      ##3
      bbb   1   d      ##4
            2   e      ##5
            3   f      ##6
      ccc   1   g      ##7
            2   h      ##8
            3   i      ##9
      

      【讨论】:

        【解决方案4】:

        这只是一个.melt,文档是here

        In [33]: pd.melt(df.reset_index(),
                         id_vars=['values'],
                         value_vars=['interval1','interval2','interval3'])
        Out[33]: 
          values   variable value
        0    aaa  interval1   ##1
        1    bbb  interval1   ##4
        2    ccc  interval1   ##7
        3    aaa  interval2   ##2
        4    bbb  interval2   ##5
        5    ccc  interval2   ##8
        6    aaa  interval3   ##3
        7    bbb  interval3   ##6
        8    ccc  interval3   ##9
        

        【讨论】:

        • .melt 仅适用于将一组列聚合为一个变量。 OP 的示例解决方案需要两个。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-02
        • 1970-01-01
        • 1970-01-01
        • 2020-12-27
        • 1970-01-01
        • 2019-06-30
        • 2015-08-22
        相关资源
        最近更新 更多