将pandas DataFrame重塑为堆叠/记录/数据库/长格式。

4

如何将pandas DataFrame从宽格式转换为堆叠/记录/数据库/长格式是最佳方法?

这里有一个小的代码示例:

宽格式:

date        hour1  hour2  hour3  hour4
2012-12-31   9.18  -0.10  -7.00 -64.92
2012-12-30  13.91   0.09  -0.96   0.08
2012-12-29  12.97  11.82  11.65  10.20
2012-12-28  22.01  16.04  15.68  11.67
2012-12-27  11.44   0.07 -19.97 -67.98
...

堆叠/记录/数据库/长格式(必需):

date                  hour                   price
2012-12-31 00:00:00   hour1                   9.18
2012-12-31 00:00:00   hour2                   -0.1
2012-12-31 00:00:00   hour3                     -7
2012-12-31 00:00:00   hour4                 -64.92
...
2012-12-30 00:00:00   hour1                   7.18
2012-12-30 00:00:00   hour2                   -1.1
2012-12-30 00:00:00   hour3                     -9
2012-12-30 00:00:00   hour4                 -74.91
...
2个回答

9
你可以使用 melt 函数将数据框从宽格式转换为长格式:
import pandas as pd
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]})
print pd.melt(df, id_vars=['date'], value_vars=['hour1', 'hour2'], var_name='hour', value_name='price')

输出:

         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

非常好用 :) 谢谢!! - Cord Kaldemeyer

2
您可以使用stack将DataFrame进行透视。首先将date设置为索引列:
>>> df.set_index('date').stack()
date             
2012-12-31  hour1      9.18
            hour2     -0.10
            hour3     -7.00
            hour4    -64.92
2012-12-30  hour1     13.91
            hour2      0.09
            hour3     -0.96
            hour4      0.08
...

实际上它返回一个带有多级索引的Series。要创建一个与您指定的相似的DataFrame,您可以在堆叠后重置MultiIndex并重新命名列:

>>> stacked = df.set_index('date').stack()
>>> df2 = stacked.reset_index()
>>> df2.columns = ['date', 'hour', 'price']
>>> df2
          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
...

我已经尝试使用stack()函数,但不知道重置MultiIndex会为我解决问题。谢谢你们两个!! - Cord Kaldemeyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接