以下代码生成一个带有分层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
变量?
答案 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'])