创建一个空的 MultiIndex
Creating an empty MultiIndex
我想在将行分配给它。我已经发现空 DataFrame 不喜欢动态分配 MultiIndexes,因此我在创建期间设置了 MultiIndex names。但是,我不想分配 levels,因为这将在稍后完成。这是迄今为止我得到的最好的代码:
def empty_multiindex(names):
"""
Creates empty MultiIndex from a list of level names.
"""
return MultiIndex.from_tuples(tuples=[(None,) * len(names)], names=names)
这给了我
In [2]:
empty_multiindex(['one','two', 'three'])
Out[2]:
MultiIndex(levels=[[], [], []],
labels=[[-1, -1, -1], [-1, -1, -1], [-1, -1, -1]],
names=[u'one', u'two', u'three'])
和
In [3]:
DataFrame(index=empty_multiindex(['one','two', 'three']))
Out[3]:
one two three
NaN NaN NaN
好吧,我对这些 NaN 毫无用处。我可以稍后轻松删除它们,但这显然是一个 hackish 解决方案。谁有更好的?
解决办法是去掉标签。这对我来说很好用:
>>> my_index = pd.MultiIndex(levels=[[],[],[]],
labels=[[],[],[]],
names=[u'one', u'two', u'three'])
>>> my_index
MultiIndex(levels=[[], [], []],
labels=[[], [], []],
names=[u'one', u'two', u'three'])
>>> my_columns = [u'alpha', u'beta']
>>> df = pd.DataFrame(index=my_index, columns=my_columns)
>>> df
Empty DataFrame
Columns: [alpha, beta]
Index: []
>>> df.loc[('apple','banana','cherry'),:] = [0.1, 0.2]
>>> df
alpha beta
one two three
apple banana cherry 0.1 0.2
希望对您有所帮助!
对于 Pandas 版本 >= 0.25.1:
关键字 labels
已替换为 codes
另一种可能更简单的解决方案是使用函数 set_index
:
>>> import pandas as pd
>>> df = pd.DataFrame(columns=['one', 'two', 'three', 'alpha', 'beta'])
>>> df = df.set_index(['one', 'two', 'three'])
>>> df
Empty DataFrame
Columns: [alpha, beta]
Index: []
>>> df.loc[('apple','banana','cherry'),:] = [0.1, 0.2]
>>> df
alpha beta
one two three
apple banana cherry 0.1 0.2
使用 pd.MultiIndex.from_arrays
可以在显式定义索引时提供更简洁的解决方案:
import pandas as pd
ind = pd.MultiIndex.from_arrays([[]] * 3, names=(u'one', u'two', u'three'))
df = pd.DataFrame(columns=['alpha', 'beta'], index=ind)
df.loc[('apple','banana','cherry'), :] = [4, 3]
alpha beta
one two three
apple banana cherry 4 3
使用 pd.MultiIndex.from_tuples 可能更直接。
import pandas as pd
ind = pd.MultiIndex.from_tuples([], names=(u'one', u'two', u'three'))
df = pd.DataFrame(columns=['alpha', 'beta'], index=ind)
df.loc[('apple','banana','cherry'), :] = [4, 3]
df
alpha beta
one two three
apple banana cherry 4 3
我想在将行分配给它。我已经发现空 DataFrame 不喜欢动态分配 MultiIndexes,因此我在创建期间设置了 MultiIndex names。但是,我不想分配 levels,因为这将在稍后完成。这是迄今为止我得到的最好的代码:
def empty_multiindex(names):
"""
Creates empty MultiIndex from a list of level names.
"""
return MultiIndex.from_tuples(tuples=[(None,) * len(names)], names=names)
这给了我
In [2]:
empty_multiindex(['one','two', 'three'])
Out[2]:
MultiIndex(levels=[[], [], []],
labels=[[-1, -1, -1], [-1, -1, -1], [-1, -1, -1]],
names=[u'one', u'two', u'three'])
和
In [3]:
DataFrame(index=empty_multiindex(['one','two', 'three']))
Out[3]:
one two three
NaN NaN NaN
好吧,我对这些 NaN 毫无用处。我可以稍后轻松删除它们,但这显然是一个 hackish 解决方案。谁有更好的?
解决办法是去掉标签。这对我来说很好用:
>>> my_index = pd.MultiIndex(levels=[[],[],[]],
labels=[[],[],[]],
names=[u'one', u'two', u'three'])
>>> my_index
MultiIndex(levels=[[], [], []],
labels=[[], [], []],
names=[u'one', u'two', u'three'])
>>> my_columns = [u'alpha', u'beta']
>>> df = pd.DataFrame(index=my_index, columns=my_columns)
>>> df
Empty DataFrame
Columns: [alpha, beta]
Index: []
>>> df.loc[('apple','banana','cherry'),:] = [0.1, 0.2]
>>> df
alpha beta
one two three
apple banana cherry 0.1 0.2
希望对您有所帮助!
对于 Pandas 版本 >= 0.25.1:
关键字 labels
已替换为 codes
另一种可能更简单的解决方案是使用函数 set_index
:
>>> import pandas as pd
>>> df = pd.DataFrame(columns=['one', 'two', 'three', 'alpha', 'beta'])
>>> df = df.set_index(['one', 'two', 'three'])
>>> df
Empty DataFrame
Columns: [alpha, beta]
Index: []
>>> df.loc[('apple','banana','cherry'),:] = [0.1, 0.2]
>>> df
alpha beta
one two three
apple banana cherry 0.1 0.2
使用 pd.MultiIndex.from_arrays
可以在显式定义索引时提供更简洁的解决方案:
import pandas as pd
ind = pd.MultiIndex.from_arrays([[]] * 3, names=(u'one', u'two', u'three'))
df = pd.DataFrame(columns=['alpha', 'beta'], index=ind)
df.loc[('apple','banana','cherry'), :] = [4, 3]
alpha beta
one two three
apple banana cherry 4 3
使用 pd.MultiIndex.from_tuples 可能更直接。
import pandas as pd
ind = pd.MultiIndex.from_tuples([], names=(u'one', u'two', u'three'))
df = pd.DataFrame(columns=['alpha', 'beta'], index=ind)
df.loc[('apple','banana','cherry'), :] = [4, 3]
df
alpha beta
one two three
apple banana cherry 4 3