使用语法糖创建具有多级索引的pandas系列

4
以下代码生成一个带有分层MultiIndex的Pandas系列:
import pandas as pd
number_of_classes = 3
number_of_price_brackets = 10
survival_table = pd.Series(
  index = pd.MultiIndex.from_tuples(
    [(gender,klass,fare)
     for gender in range(2)
     for klass in range(number_of_classes)
     for fare in range(number_of_price_brackets)],
     names=['Gender','Class','Price Bracket']
     ))

但这种方法似乎有点“手动”。是否有更漂亮的方式生成survival_table变量?

3个回答

4

对我来说看起来很好。

你可以使用itertools.product创建元组,而无需在推导式中使用三个for部分。但我认为这种方法同样好,对初学者来说更易读,而使用itertools的方法则较少。使用itertools的方法如下:

list(itertools.product(range(2), 
                       range(number_of_classes), 
                       range(number_of_price_brackets)))

如果您经常这样做,您还可以定义一个帮助函数。

def make_category_multiindex(categories, names):
    from itertools import product
    return pd.MultiIndex.from_tuples(list(product(*categories)), names=names)

然后执行:
categories = [range(2), 
              range(number_of_classes), 
              range(number_of_price_brackets)]

names = ['Gender','Class','Price Bracket']

survival_table = pd.Series(index=make_category_multiindex(categories, names))

3

同样的思路,不同的结构:

import pandas as pd
from itertools import product

column_names = ['Gender', 'Class', 'Price Bracket']
ranges = [range(2), range(3), range(10)]
multi_index = pd.MultiIndex.from_tuples(
                            list(product(*ranges)), 
                            names=column_names)
survival_table = pd.Series(index=multi_index)

1
需要注意的是,Pandas 0.13引入了pd.MultiIndex.from_product()函数,可以这样使用:
pandas.MultiIndex.from_product((range(2),
                                range(3),
                                range(10)),
                                names=['Gender','Class','Price Bracket'])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接