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变量?

4

3 回答 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))
于 2013-10-23T20:38:01.503 回答
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)
于 2013-10-23T20:40:33.160 回答
1

需要注意的是,Pandas 0.13 引入了 pd.MultiIndex.from_product() 允许写入:

pandas.MultiIndex.from_product((range(2),
                                range(3),
                                range(10)),
                                names=['Gender','Class','Price Bracket'])
于 2014-08-03T19:44:35.377 回答