【问题标题】:Pandas Melt function for time series data用于时间序列数据的 Pandas Melt 函数
【发布时间】:2021-05-08 21:34:49
【问题描述】:

我正在尝试融化我的 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 行。我希望我的数据框看起来像这样:

我知道如果我将“日期”保留为一列(而不是索引),我可以这样做:

df1 =df1.melt(id_vars="date", var_name="FIPS", value_name="Covid_cases")

但如果我这样做,那么在尝试将“日期”列转换为索引时会出错。我需要它作为日期时间索引的索引,因为我要对时间序列数据进行 kmeans 聚类,然后绘制时间序列聚类。任何投入将不胜感激!谢谢!

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    如果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
    

    【讨论】:

      【解决方案2】:

      或者您可以通过stack 进行此操作。

      df = (
          df.stack()
          .reset_index()
          .rename(columns={'level_1': 'FIPS', 0: 'Covid_cases'})
          .set_index('date')
      )
      
      

      【讨论】:

        【解决方案3】:

        您应该使用ignore_index=False(默认设置为True),而不是使用id_vars。使用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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-07
          • 2021-02-16
          相关资源
          最近更新 更多