Pandas Melt函数用于时间序列数据的转换

4

我正在尝试“融化”我的pandas数据框,但我不太确定如何正确地分配变量。我查看了堆栈上的其他示例,但似乎找不到与此匹配的变体。我的数据框(df1)如下所示:

[IN]: df1
[OUT]:
             40025.0    21201.0       30061.0   46021.0
date                
2020-08-08  0.000861    0.001292    0.000287    0.001177
2020-08-09  0.001147    0.001290    0.000344    0.001204
2020-08-10  0.001431    0.001288    0.000401    0.001231

每一列都代表不同的FIPS代码,值是每天的Covid病例数(此数据已为将来的聚类处理),索引是日期时间索引(日)。数据框为804列x 470行。我希望我的数据框看起来像这样:enter image description here 我知道如果将“日期”作为列(而不是索引)可以实现这个目标,方法如下:
df1 =df1.melt(id_vars="date", var_name="FIPS", value_name="Covid_cases")

但是如果我这样做,当尝试将“date”列转换为索引时会出现错误。我需要它作为日期时间索引,因为我要对时间序列数据进行kmeans聚类,然后绘制时间序列簇。非常感谢任何意见!谢谢!
3个回答

2
如果当前索引是date,您可以使用reset_index()然后再使用set_index('date')来重新设置索引:
df1 = (df1
    .reset_index()
    .melt(id_vars='date', var_name='FIPS', value_name='Covid_cases')
    .set_index('date')
)

               FIPS  Covid_cases
date                            
2020-08-08  40025.0     0.000861
2020-08-09  40025.0     0.001147
2020-08-10  40025.0     0.001431
2020-08-08  21201.0     0.001292
2020-08-09  21201.0     0.001290
2020-08-10  21201.0     0.001288
2020-08-08  30061.0     0.000287
2020-08-09  30061.0     0.000344
2020-08-10  30061.0     0.000401
2020-08-08  46021.0     0.001177
2020-08-09  46021.0     0.001204
2020-08-10  46021.0     0.001231

1
或者您可以通过 stack 进行此操作。
df = (
    df.stack()
    .reset_index()
    .rename(columns={'level_1': 'FIPS', 0: 'Covid_cases'})
    .set_index('date')
)


0

你应该使用ignore_index=False而不是id_vars(默认情况下设置为True)。使用ignore_index=True,pandas在展开之前不会重置索引。

>>> df1 = df1.melt(var_name='FIPS', value_name='Cases', ignore_index=False)
>>> df1
               FIPS     Cases
date
2020-08-08  40025.0  0.000861
2020-08-09  40025.0  0.001147
2020-08-10  40025.0  0.001431
2020-08-08  21201.0  0.001292
2020-08-09  21201.0  0.001290
2020-08-10  21201.0  0.001288
2020-08-08  30061.0  0.000287
2020-08-09  30061.0  0.000344
2020-08-10  30061.0  0.000401
2020-08-08  46021.0  0.001177
2020-08-09  46021.0  0.001204
2020-08-10  46021.0  0.001231

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