我有一个实用程序函数,用于在我有两个或更多个iterables时创建Pandas MultiIndex,并且我想为这些迭代中的值的每个唯一配对创建一个索引键.看起来像这样
import pandas as pd
import itertools
def product_index(values, names=None):
"""Make a MultiIndex from the combinatorial product of the values."""
iterable = itertools.product(*values)
idx = pd.MultiIndex.from_tuples(list(iterable), names=names)
return idx
Run Code Online (Sandbox Code Playgroud)
并且可以像:
a = range(3)
b = list("ab")
product_index([a, b])
Run Code Online (Sandbox Code Playgroud)
创造
MultiIndex(levels=[[0, 1, 2], [u'a', u'b']],
labels=[[0, 0, 1, 1, 2, 2], [0, 1, 0, 1, 0, 1]])
Run Code Online (Sandbox Code Playgroud)
这很好用,但它似乎是一个常见的用例,我很惊讶我必须自己实现它.所以,我的问题是,我在Pandas库中错过/误解了哪些提供此功能?
编辑补充:这个功能已经被添加到大熊猫作为MultiIndex.from_product
为0.13.1版本.
Jef*_*eff 12
这是一个非常相似的结构(但是cartesian_product
对于更大的数组使用更快itertools.product
)
In [2]: from pandas.tools.util import cartesian_product
In [3]: MultiIndex.from_arrays(cartesian_product([range(3),list('ab')]))
Out[3]:
MultiIndex(levels=[[0, 1, 2], [u'a', u'b']],
labels=[[0, 0, 1, 1, 2, 2], [0, 1, 0, 1, 0, 1]])
Run Code Online (Sandbox Code Playgroud)
可能会添加为一种方便的方法 MultiIndex.from_iterables(...)
请打开一个问题(如果你愿意的话可以公关)
仅供参考我很少实际构建一个多指数"手动",几乎总是更容易实际构建一个框架而且只是set_index
.
In [10]: df = DataFrame(dict(A = np.arange(6),
B = ['foo'] * 3 + ['bar'] * 3,
C = np.ones(6)+np.arange(6)%2)
).set_index(['C','B']).sortlevel()
In [11]: df
Out[11]:
A
C B
1 bar 4
foo 0
foo 2
2 bar 3
bar 5
foo 1
[6 rows x 1 columns]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3116 次 |
最近记录: |