【问题标题】:Pivoting dataframes with pd.melt() on time series data使用 pd.melt() 在时间序列数据上旋转数据帧
【发布时间】:2020-04-11 19:53:41
【问题描述】:

我这里有一些数据:

       Country/Region  1/22/20  1/23/20  1/24/20  1/25/20  1/26/20  1/27/20
0               Afghanistan        0        0        0        0        0   
1                   Albania        0        0        0        0        0   
2                   Algeria        0        0        0        0        0   
3                   Andorra        0        0        0        0        0   
4                    Angola        0        0        0        0        0   
5       Antigua and Barbuda        0        0        0        0        0   
6                 Argentina        0        0        0        0        0   
7                   Armenia        0        0        0        0        0   
8                 Australia        0        0        0        0        0   
9                 Australia        0        0        0        0        3   
10                Australia        0        0        0        0        0   
11                Australia        0        0        0        0        0   
12                Australia        0        0        0        0        0   
13                Australia        0        0        0        0        0   
14                Australia        0        0        0        0        1   
15                Australia        0        0        0        0        0   
16                  Austria        0        0        0        0        0   
17               Azerbaijan        0        0        0        0        0   
18                  Bahamas        0        0        0        0        0   
19                  Bahrain        0        0        0        0        0   
20               Bangladesh        0        0        0        0        0   

我想重新排列,以便日期是行,而国家是列。像这样:

Country/Region   Afghanistan   Albania

1/22/20              0            0
1/23/20              0            0
1/24/20              0            0

等等。我尝试使用 pd.melt,但不能完全确定如何获得所需的输出。这是我的尝试:

%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import math

data = pd.read_csv("covid.csv", sep=",")

data = data.drop(["Province/State","Lat","Long"], axis=1)

data_melted = data.melt(value_vars=data.columns[1:], var_name="Date",value_name="Cases")

          Date  Cases
0      1/22/20      0
1      1/22/20      0
2      1/22/20      0
3      1/22/20      0
4      1/22/20      0
5      1/22/20      0
6      1/22/20      0
7      1/22/20      0
8      1/22/20      0
9      1/22/20      0
10     1/22/20      0
11     1/22/20      0
12     1/22/20      0
13     1/22/20      0
14     1/22/20      0


我也试过了:

data_melted = data.melt(value_vars=[data.columns[1:], "Country/Region"])

但这会产生一个 TypeError: unhashable type: 'Index' 即使 "Country/Region" 不是索引。

不胜感激。

【问题讨论】:

  • df.set_index('Country/Region').T?
  • 谢谢,这行得通 - 比我想象的要简单!

标签: python pandas time-series pivot melt


【解决方案1】:

您正在寻找转置表格:

df.set_index('Country/Region').T

我注意到Australia 重复了多次,如果您想通过将它们相加来合并:

df.set_index('Country/Region').T \
    .groupby(level=0, axis=1) \
    .sum()

【讨论】:

    【解决方案2】:

    如果您指定pandas.meltid_vars 参数,原始尝试将起作用。然后,对于国家/地区列,运行 pivot_table 聚合,该聚合实际上呈现时间序列数据框(即日期/时间作为索引)以进行直接绘图。

    data_melted = (data.melt(id_vars = ['Country/Region'],
                             var_name = 'Date', value_name='Cases')
                       .assign(Date = lambda x: pd.to_datetime(x['Date']))
    
    data_pivoted = data_melted.pivot_table(index='Date', columns='Country/Region', 
                                           values='Cases', aggfunc='sum')
    

    【讨论】:

      猜你喜欢
      • 2021-04-09
      • 1970-01-01
      • 2018-02-08
      • 1970-01-01
      • 2020-11-15
      • 2021-04-04
      • 1970-01-01
      • 2021-11-20
      • 2020-03-14
      相关资源
      最近更新 更多