这应该很简单,但无法将我的大脑包裹住。
我正在尝试将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']})
我尝试了正则表达式和数据透视,但无法找出最好的方法。非常感谢这里的任何帮助。
答案 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