我一直在研究熊猫的公开数据集,其中包含美国各州的一些空气质量统计数据。
我将其数据集加载到熊猫数据框中,并使用groupby
按state
对事物进行分组。像这样:
import pandas as pd
poll = pd.read_csv(`dataset.csv')
poll = poll.groupby(['State', 'Date Local']).mean()
ds_gb_state = poll.groupby(level='State')
打印出这样的内容:
V1 V2 V3 V4
State Date Local
Alabama 2013-12-01 37.000000 24.000000 1.000000 6.000000
2013-12-02 30.000000 12.000000 3.000000 6.000000
2013-12-03 21.000000 11.000000 3.000000 3.000000
2013-12-04 18.000000 13.000000 1.000000 2.000000
2013-12-05 15.000000 13.000000 1.000000 2.000000
Alaska 2014-07-01 4.000000 16.000000 6.000000 3.000000
2014-07-02 4.000000 15.000000 6.000000 3.000000
2014-07-03 6.000000 19.000000 13.000000 3.000000
我的问题很简单。使用此ds_gb_state
对象,如何找到所有状态的名称?在此对象中,列为V1, V2, V3 and V4
,可以很好地访问它们,但是是否可以枚举所有状态或从该对象中找到最小和最大日期?
答案 0 :(得分:2)
如何找到所有州的名称?
您可以使用MultiIndex.get_level_values
:
df.index.get_level_values(0).unique()
# Index(['Alabama', 'Alaska'], dtype='object')
是否可以从该对象中找到最小和最大日期?
类似地输入日期:
df.index.get_level_values(1).map(pd.to_datetime).min()
# Timestamp('2013-12-01 00:00:00')
答案 1 :(得分:1)
pandas.MultiIndex
的主要组成部分是levels
和labels
属性。构造一个对象时,levels
应该是FrozenList
个对象中的pandas.Index
个。更重要的是,这些Index
对象应该是唯一的(可以故意破坏,但通常是True
)。这样,您可以使用
ds_gb_state.index.levels[0]
Index(['Alabama', 'Alaska'], dtype='object', name='State')
假设第二级是dtype datetime
ds_gb_state.index.set_levels(pd.to_datetime(ds_gb_state.index.levels[1]), 1, True)
我们可以使用相同的技巧来获得最小值。
ds_gb_state.index.levels[1].min()
Timestamp('2013-12-01 00:00:00')
尽管我相信@yatu's answer是完全应得的。它值得比较
方法get_level_values
使用了levels
和labels
属性,并且等效于此
ds_gb_state.index.get_level_values(0)
Index(['Alabama', 'Alabama', 'Alabama', 'Alabama', 'Alabama', 'Alaska',
'Alaska', 'Alaska'],
dtype='object', name='State')
和
ds_gb_state.index.levels[0][ds_gb_state.index.labels[0]]
Index(['Alabama', 'Alabama', 'Alabama', 'Alabama', 'Alabama', 'Alaska',
'Alaska', 'Alaska'],
dtype='object', name='State')
因此,要获取唯一值,熊猫必须获取已经具有唯一值的slice才能产生潜在的非唯一值,而又要经历使其再次变得唯一的麻烦。我建议跳过不必要的步骤。