【问题标题】:How to sort multindex columns in Pandas如何对 Pandas 中的多索引列进行排序
【发布时间】:2019-02-08 00:56:19
【问题描述】:

我正在尝试操作一堆多索引 Pandas 数组。每列都是具有不同分类分组的时间序列。我想对数据进行排序,然后解析所有类别,然后进行一些额外的数据操作。这是我尝试但没有工作的示例代码

import pandas as pd
import numpy as np
df=pd.DataFrame({'t': range(1,11)})
df.set_index(['t'],inplace=True)

for num in range(2):
    labely = (str(num),'A','y')
    labelx = (str(num),'A','x')
    labelbx = (str(num),'B','x')
    df[labelx]= np.random.randn(10)
    df[labelbx]= np.random.randn(10)
    df[labely]= np.random.randn(10)+range(1,11)

df.columns = pd.MultiIndex.from_tuples(df.columns, names=['ID','Location','Direction']) 

df[('0','A','tot')]=df[('0','A','y')]+df[('0','A','x')]
df.sort_index(level='ID',inplace=True)
df.head()

这没有排序。这是总数未与其他 0 ID 分组且位置未分组在一起的结果:

ID                0                        ...            1                   0
Location          A         B         A    ...            B         A         A
Direction         x         x         y    ...            x         y       tot
t                                          ...                                 
1          0.430386 -0.121109  0.263314    ...     0.243839  0.313505  0.693700
2         -1.262746 -0.678889  1.289814    ...    -0.893230  0.373103  0.027068
3          0.245483 -0.565859  3.766628    ...     0.012933  1.652484  4.012111
4          1.518357  0.447032  5.649877    ...    -1.205161  5.513507  7.168233
5         -0.095216 -0.571333  6.794958    ...    -0.777933  4.073334  6.699741

我有 2 个与此相关的问题。

  1. 如何对列进行排序,以便按每个 等级
  2. 如何有效地解析通过数据框来做 额外的数据操作。

这是第二个问题的一些 sudo 代码

for id in ID: 
     for loc in Location:
               df[(id,loc,'tot')=df[(id,loc,'x')]+df[(id,loc,'y')]

【问题讨论】:

  • sort_index有一个参数axis默认为0,表示按索引排序。您需要axis=1 才能按列排序。
  • 谢谢。这完美无缺。这解决了问题 #1。仍然不确定如何解析数据框。

标签: python pandas sorting multi-index


【解决方案1】:

按列排序,正如 Ian 回答的 axis=1:

df.sort_index(level='ID',axis=1,inplace=True)

要获取要解析的唯一列名的元组列表,我需要 columns.values,然后在计算后使用。

for id,loc,dir in df.columns.values:
    df[(id,loc,'tot')]=(df[(id,loc,'x')]**2+df[(id,loc,'y')]**2)**.5
df.sort_index(level='ID',axis=1,inplace=True)

由于这是基本的列计算,我认为这种方法会很有效。

【讨论】:

    猜你喜欢
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 2021-06-09
    • 2023-03-29
    • 2019-03-26
    相关资源
    最近更新 更多