Pandas:多索引组

问题描述 投票:0回答:1

我有以下数据:

import pandas as pd, numpy as np

data = [['id',    'date',      'b_field',   'a_field'],
        ['XYX',   '01/01/2024',  100,        101],
        ['XYX',   '01/02/2024',  200,        201],
        ['ABC',   '01/01/2024',  300,        301],
        ['ABC',   '01/02/2024',  400,        401]]

id_sort=['ABC', 'XYZ']
field_sort=['a_field', 'b_field']
df = pd.DataFrame(data[1:], columns=data[:1])

[![在此处输入图像描述][1]][1]

我想有效地转换它,这样如果我将其序列化为 csv 或 json 数组,它看起来像这样:

[![在此处输入图像描述][2]][2]

地点:

  1. ID 分组在顶部(每列不重复)
  2. 按 ID 排序,然后按字段排序
  3. 与字段位于同一列行上的日期标签

到目前为止我已经尝试了一些事情。我最接近的是以下:

df.set_index('date').reindex(pd.MultiIndex.from_product([id_sort, field_sort]),axis=1).reset_index()

当然,正如您所看到的,存在几个问题:

  1. 没有值
  2. “日期”标签位于顶层,而不是第二层
  3. 日期看起来像一个元组,不知道为什么

[![在此处输入图像描述][3]][3]

编辑: 对于#2,为了向下移动日期标签,看起来我可以这样做(不确定这是否是最好的方法):

df = df.rename(columns={'date': '', '':'date'})
``

  [1]: https://i.sstatic.net/fmdYCJ6t.png
  [2]: https://i.sstatic.net/fzlAY1W6.png
  [3]: https://i.sstatic.net/z9ZNx5nm.png
python pandas
1个回答
0
投票

这是一种方法:

df = pd.DataFrame(data[1:], columns=data[:1][0])

out = (
    df
    .set_index(['id', 'date'])
    .unstack(0)
    .swaplevel(axis=1)
    .sort_index(axis=1)
    .rename_axis(columns=(None, None))
)

输出

               ABC             XYX        
           a_field b_field a_field b_field
date                                      
01/01/2024     301     300     101     100
01/02/2024     401     400     201     200
© www.soinside.com 2019 - 2024. All rights reserved.