具有行和列的MultiIndex数据框

时间:2020-10-03 21:51:44

标签: python pandas dataframe multi-index

我很难拆分数据帧。我希望得到一些帮助。 我正在尝试将原始数据拆分为第一行中索引的每个城市和第一列中的日期的数据框。根据我的实际数据,我有189个独特的城市

原始数据:

Original data

这是我的目标:

goal

我尝试了多种方法,但索引仍在前两列中。

2 个答案:

答案 0 :(得分:3)

这可以使用df.pivot()df.reorder_levels()df.sort_index()完成。

  • df.pivot():将表转置为层次列
    • axis=1指的是列,而axis=0指的是行。
  • df.reorder_levels():向上移动城市,向下移动Vals
  • df.sort_index():使用默认顺序或自定义顺序对行和列进行排序(例如,按datetime而不是str排序)。

代码

import pandas as pd
import numpy as np

df = pd.DataFrame(
    data={  # please provide sample data next time
        "City": ["NYC"]*5 + ["LA"]*5 + ["OKC"]*5,
        "Date": ["6/1/1998", "7/1/1998", "8/1/1998", "9/1/1998", "10/1/1998"]*3,
        "Val1": np.array(range(15))*10,
        "Val2": np.array(range(15))/10,
        "Val3": np.array(range(15)),
    }
)

df_out = df.pivot(index="Date", columns=["City"], values=["Val1", "Val2", "Val3"])\
    .reorder_levels([1, 0], axis=1)\
    .sort_index(axis=1)\
    .sort_index(axis=0, key=lambda s: pd.to_datetime(s))

输出

In[27]: df_out
Out[27]: 

City         LA             NYC              OKC           
           Val1 Val2 Val3  Val1 Val2 Val3   Val1 Val2  Val3
Date                                                       
6/1/1998   50.0  0.5  5.0   0.0  0.0  0.0  100.0  1.0  10.0
7/1/1998   60.0  0.6  6.0  10.0  0.1  1.0  110.0  1.1  11.0
8/1/1998   70.0  0.7  7.0  20.0  0.2  2.0  120.0  1.2  12.0
9/1/1998   80.0  0.8  8.0  30.0  0.3  3.0  130.0  1.3  13.0
10/1/1998  90.0  0.9  9.0  40.0  0.4  4.0  140.0  1.4  14.0

如果要删除左上角的“城市”标签,只需直接设置df_out.columns.names

df_out.columns.names=[None, None]

答案 1 :(得分:0)

--go_out=./gps_go_proto

输出:

enter image description here