pandas 如何从多索引结构的索引中选择单个列?

roejwanj  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(123)

我在从多索引pandas框架的索引中获取列时遇到问题。
通常情况下,如果我想从一个没有多索引的常规嵌套框架中获取一个列,这很容易。我只需执行df `col_name ']或df.col_name,我就可以获取该列。然而,对于多索引嵌套框架,当我想要的列在嵌套框架的多索引中时,这不起作用。(我仍然可以得到一个常规列。)例如,如果我对多索引中的col_name执行df_name ']或df.col_name,我会得到一个错误:KeyError:'col_name'
我能想到的唯一解决方案,而不是进入疯狂的体操(df.index.get_level_values('col_name'))是以下:
df.reset_index()'col_name ']或df.reset_index().col_name
我觉得我一定是误解或错过了什么,因为选择一个列在多索引应该是容易和直接向前,因为它是非常普遍的希望。什么是一个简单的方法来选择一个单一的列从多索引?
范例:

import pandas as pd

file_name = "https://raw.githubusercontent.com/uiuc-cse/data-fa14/gh-pages/data/iris.csv"
df = pd.read_csv(file_name)
df = df.set_index(['sepal_length','sepal_width'])
print(df.head())

                          petal_length  petal_width species
sepal_length sepal_width                                   
5.1          3.5                   1.4          0.2  setosa
4.9          3.0                   1.4          0.2  setosa
4.7          3.2                   1.3          0.2  setosa
4.6          3.1                   1.5          0.2  setosa
5.0          3.6                   1.4          0.2  setosa

df['sepal_length'] #KeyError: 'sepal_length'
df.sepal_length #KeyError: 'sepal_length'
df.loc['sepal_length'] #KeyError: 'sepal_length'
df.loc['sepal_length',:] #KeyError: 'sepal_length'
df.index.sepal_length # AttributeError: 'MultiIndex' object has no attribute 'sepal_length'
df.index['sepal_length'] #IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

字符串

mi7gmzs6

mi7gmzs61#

要从多索引中获取单个列,请使用index.get_level_values()方法。
这里是Document

import pandas as pd

file_name = ("https://raw.githubusercontent.com/uiuc-cse/data-fa14/gh-pages/data/iris.csv")

df = pd.read_csv(file_name)
df = df.set_index(["sepal_length", "sepal_width"])
df.index.get_level_values("sepal_length")
# or
df.index.get_level_values(0)

字符串
测试结果:

Float64Index([5.1, 4.9, 4.7, 4.6, 5.0, 5.4, 4.6, 5.0, 4.4, 4.9,
              ...
              6.7, 6.9, 5.8, 6.8, 6.7, 6.7, 6.3, 6.5, 6.2, 5.9],
              dtype='float64', name='sepal_length', length=150)

flvlnr44

flvlnr442#

在DataFrame MultiIndex中,你所说的“列”被称为一个级别。从MultiIndex中获取级别的方法是使用pd.Index.get_level_values()df.reset_index()["column"],正如你所说的。
我觉得我一定是误解或错过了一些东西,因为在多索引中选择一个列应该很容易和直接,因为这是很常见的。
我不认为这是很常见的要选择一个级别的MultiIndex.如果你发现自己想这样做经常,那么我建议你只是有这个级别作为一个适当的列在DataFrame本身.例如,你可以保留MultiIndex和有水平作为列使用

df.assign(sepal_length=lambda X: X.index.get_level_values("sepal_length"))

字符串
通常,DataFrame索引的目的是唯一标识DataFrame中的每一行。如果需要多条信息来唯一标识一个观测,则MultiIndex可以提供帮助。我经常使用houly时间序列数据,其中每个观测/行由日期和小时唯一定义,因此具有这两条信息的MultiIndex工作得很好。在您给予的示例中,两朵鸢尾花的萼片宽度和长度可能相同,因此将这两个指标结合起来作为索引并不是最好的选择。更好的选择是花的ID号。

相关问题