使用索引名称

时间:2017-09-11 08:52:34

标签: python pandas dataframe

我想在使用名称访问索引列的特定值时使用MultiIndex迭代DataFrame。例如,给出以下

import pandas as pd
index = pd.MultiIndex.from_product([range(2), range(3)], names=['index_a', 'index_b'])
table = pd.DataFrame({'my_column': range(len(index))}, index=index)

我想使用如下代码迭代table行:

for row in named_index_iterator(table):
    print(row.my_column, row.index_a, row.index_b)

for row in named_index_iterator(table):
    print(row.my_column, row.Index.index_a, row.Index.index_b)

实现named_index_iterator我不能在DataFrame中使用itertuples或iterrows,因为它为索引提供了简单的元组,而不是命名元组。同样地,我不能使用类似的东西:

for data_row, index_row: itertools.zip_longest(table.itertuples(), table.index): 

作为table.index上的迭代器再次给出了简单的元组,而不是元组。

现在我使用

作为解决方法
for row in table.reset_index().itertuples():

但复制表格。

1 个答案:

答案 0 :(得分:0)

回答自己的参考问题。

我创建了以下实用程序来按名称迭代索引:

import collections

def df_iter_with_index_names(table):
    IndexNames = collections.namedtuple('IndexNames', table.index.names)
    for row in table.itertuples():
        yield (IndexNames(*row.Index), row)

的用法如下:

import collections
import pandas as pd
index = pd.MultiIndex.from_product([range(2), range(3)], names=['index_a', 'index_b'])
table = pd.DataFrame({'my_column': range(len(index))}, index=index)
print(table)

def df_iter_with_index_names(table):
    IndexNames = collections.namedtuple('IndexNames', table.index.names)
    for row in table.itertuples():
        yield (IndexNames(*row.Index), row)

for index, row in df_iter_with_index_names(table):
    print(index.index_a, row.my_column)

可以改进从行元组中删除索引名称,这是DataFrame.itertuples()的剩余部分,但我可以接受它。