用于创建具有MultiIndex的pandas系列的语法糖

时间:2013-10-23 20:27:43

标签: python pandas

以下代码生成一个带有分层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 个答案:

答案 0 :(得分: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))

答案 1 :(得分: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)

答案 2 :(得分:1)

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

pandas.MultiIndex.from_product((range(2),
                                range(3),
                                range(10)),
                                names=['Gender','Class','Price Bracket'])