Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas 如何用宽到长或枢轴重塑数据帧?_Pandas_Format_Pivot - Fatal编程技术网

Pandas 如何用宽到长或枢轴重塑数据帧?

Pandas 如何用宽到长或枢轴重塑数据帧?,pandas,format,pivot,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'],

这应该是相当简单的,但我还没有能够把我的大脑围绕它

我正在尝试将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']})
我尝试了regex和pivot,但找不到最好的方法。非常感谢您的帮助。

您可以尝试:

(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

您可以首先通过在
上拆分来切换列名,然后使用:

输出

  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

谢谢你们两位的快速回复。这两种解决方案都能产生所需的结果。我最终使用了Erfan的方法,因为在每一行中都会复制存储。
  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