在数据分析中,经常需要对宽格式的 Pandas DataFrame 数据进行处理。宽格式 DataFrame 每一列代表一个变量,每一行代表一个样本。但是,在某些情况下,我们需要将宽格式 DataFrame 转换为数据库格式,即堆叠格式或记录格式。堆叠格式将每个变量的值放在单独的行中,每一列代表一个变量,每一行代表一个样本和变量的组合。
2、解决方案:
可以使用 Pandas 的 melt() 函数将宽格式 DataFrame 转换为堆叠格式。melt() 函数的作用是将 DataFrame 的列转换为行,并同时添加一个新的列来标识变量。可以使用 id_vars 参数指定哪些列作为标识列,并将其他列作为变量列。melt() 函数的用法如下:
pd.melt(df, id_vars=['date'], value_vars=['hour1', 'hour2'], var_name='hour', value_name='price')
http://www.jshk.com.cn/mb/reg.asp?kefu=xiaoding;//爬虫IP免费获取;
其中,df 是要转换的 DataFrame,id_vars 参数指定 date 列作为标识列,value_vars 参数指定 hour1 和 hour2 列作为变量列,var_name 参数指定 hour 列作为变量名,value_name 参数指定 price 列作为值名。
另一种方法是使用 stack() 函数将宽格式 DataFrame 转换为堆叠格式。stack() 函数的作用是将 DataFrame 的列堆叠在一起,并同时添加一个新的列来标识变量。可以使用 index 参数指定哪些列作为标识列,并将其他列作为变量列。stack() 函数的用法如下:
df.set_index('date').stack()
其中,df 是要转换的 DataFrame,set_index() 函数将 date 列设置为索引列,stack() 函数将其他列堆叠在一起,并添加一个新的列来标识变量。
得到堆叠格式的数据后,可以通过 reset_index() 函数将索引列转换为普通列,并通过 columns 属性重命名列名。
代码示例:
import pandas as pd
# 创建宽格式 DataFrame
df = pd.DataFrame({'date': ['2012-12-31', '2012-12-30', '2012-12-29', '2012-12-28', '2012-12-27'],
'hour1': [9.18, 13.91, 12.97, 22.01, 11.44],
'hour2': [-0.1, 0.09, 11.82, 16.04, 0.07]})
# 使用 melt() 函数将宽格式 DataFrame 转换为堆叠格式
df_stacked1 = pd.melt(df, id_vars=['date'], value_vars=['hour1', 'hour2'], var_name='hour', value_name='price')
# 使用 stack() 函数将宽格式 DataFrame 转换为堆叠格式
df_stacked2 = df.set_index('date').stack()
# 将索引列转换为普通列,并重命名列名
df_stacked2 = df_stacked2.reset_index()
df_stacked2.columns = ['date', 'hour', 'price']
# 打印结果
print(df_stacked1)
print(df_stacked2)
输出结果:
date hour price
0 2012-12-31 hour1 9.18
1 2012-12-30 hour1 13.91
2 2012-12-29 hour1 12.97
3 2012-12-28 hour1 22.01
4 2012-12-27 hour1 11.44
5 2012-12-31 hour2 -0.10
6 2012-12-30 hour2 0.09
7 2012-12-29 hour2 11.82
8 2012-12-28 hour2 16.04
9 2012-12-27 hour2 0.07
date hour price
0 2012-12-31 hour1 9.18
1 2012-12-31 hour2 -0.10
2 2012-12-31 hour3 -7.00
3 2012-12-31 hour4 -64.92
4 2012-12-30 hour1 13.91
5 2012-12-30 hour2 0.09
6 2012-12-30 hour3 -0.96
7 2012-12-30 hour4 0.08
...