带有随附标签列的堆栈列

Stack columns with accompanying label column

我正在尝试堆叠一组列以适合内核密度估计器,以了解观察时间间隔的概率如何随着时间和价格的变化而变化。

我当前的DataFrame如下(不是精确值,只是一个例子):

date        price   1d_change  2d_price_change
2017-01-03  10.2    1.0        7.8
2017-01-04  11.2    7.8        9.4
2017-01-05  17.0    3.6        1.5
2017-01-06  20.6    -2.1       ...
2017-01-07  18.5    ...        ... 

我想将每个价格变化列堆叠成一个单独的列,并创建另一个对应于时间变化的列,例如:

price_change    time_interval
10.2            1
11.2            1
17.0            1
20.6            1
18.5            1
7.8             2
9.4             2
1.5             2

我知道我可以简单地使用 pd.hstack() 来实现这一点,但我不确定如何创建一个相应的列来标记时间的变化。

感谢收到的任何帮助。

正在设置源数据。

df = pd.DataFrame({
'date': ['2017-01-03', '2017-01-04', '2017-01-05', '2017-01-06'], 
'price': [10.2, 11.2, 17, 20.6], 
'1d': [1, 7.8, 3.6, -2.1], 
'2d': [7.8, 9.4, 1.5, 3.3]})

df = df[['date', 'price', '1d', '2d']]

print(df)
         date  price   1d   2d
0  2017-01-03   10.2  1.0  7.8
1  2017-01-04   11.2  7.8  9.4
2  2017-01-05   17.0  3.6  1.5
3  2017-01-06   20.6 -2.1  3.3

现在开始解决。基本思想如您提到的那样使用 stack。但是在正确命名轴方面需要做一些准备工作,这样当我们堆叠和 reset_index 时,列名就是我们想要的。最后一步是简单地用适当的整数替换列名称标签“1d”、“2d”等。

x = df.set_index('date').stack()
x.index.set_names(['date', 'time_interval'], inplace=True)
x.name = 'price_change'
print(x)
date        time_interval
2017-01-03  price            10.2
            1d                1.0
            2d                7.8
2017-01-04  price            11.2
            1d                7.8
            2d                9.4
2017-01-05  price            17.0
            1d                3.6
            2d                1.5
2017-01-06  price            20.6
            1d               -2.1
            2d                3.3
stacked = x.reset_index().replace({'price': 1, '1d': 2, '2d': 3})
print(stacked)
          date  time_interval  price_change
0   2017-01-03              1          10.2
1   2017-01-03              2           1.0
2   2017-01-03              3           7.8
3   2017-01-04              1          11.2
4   2017-01-04              2           7.8
5   2017-01-04              3           9.4
6   2017-01-05              1          17.0
7   2017-01-05              2           3.6
8   2017-01-05              3           1.5
9   2017-01-06              1          20.6
10  2017-01-06              2          -2.1
11  2017-01-06              3           3.3