如何使用Wide_to_long或Pivot重塑数据框?

时间:2019-09-24 18:18:33

标签: pandas format pivot

这应该很简单,但无法将我的大脑包裹住。

我正在尝试将df1转换为df2,其中df1和df2是熊猫数据帧

df1 = pd.DataFrame({'site': ['1', '2'],
                    'sat_open': ['0900', '0900'],
                    'sat_close': ['1900','1900'],
                    'sun_open': ['1000', '1000'],
                    'sun_close': ['1800', '1800'],
                    'mon_open': ['0900', '0900'],
                    'mon_close': ['2100', '2100']               
                  })

df2 = pd.DataFrame({'store': ['1', '1', '1', '2', '2','2'],
                    'day': ['sat', 'sun', 'mon','sat', 'sun', 'mon'],
                    'open': ['09:00','10:00','09:00','09:00','10:00','09:00'],
                    'close': ['19:00','18:00','21:00','19:00','18:00','21:00']})

我尝试了正则表达式和数据透视,但无法找出最好的方法。非常感谢这里的任何帮助。

2 个答案:

答案 0 :(得分:2)

您可以首先通过在_上分割来切换列名称,然后使用pd.wide_to_long

df1.columns = [f'{col.split("_")[1]}_{col.split("_")[0]}' if '_' in col else col 
               for col in df1.columns]

df2 = pd.wide_to_long(df1, stubnames=['open', 'close'], i='site', j='day', sep='_', suffix='\D+')\
        .sort_index(level=0)\
        .reset_index()

输出

  site  day  open close
0    1  mon  0900  2100
1    1  sat  0900  1900
2    1  sun  1000  1800
3    2  mon  0900  2100
4    2  sat  0900  1900
5    2  sun  1000  1800

答案 1 :(得分:1)

您可以尝试:

(pd.wide_to_long(df1, 
                 stubnames=['sat', 'sun','mon'], 
                 i='site', 
                 j='day', 
                 sep='_', suffix='(open|close)'
                )
   .stack()
   .unstack('day')
)

输出:

day      close  open
site                
1    sat  1900  0900
     sun  1800  1000
     mon  2100  0900
2    sat  1900  0900
     sun  1800  1000
     mon  2100  0900