我想在使用名称访问索引列的特定值时使用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():
但复制表格。
答案 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()
的剩余部分,但我可以接受它。