Другой вопрос pandas:
У меня есть эта таблица с иерархической индексацией:
In [51]:
from pandas import DataFrame
f = DataFrame({'a': ['1','2','3'], 'b': ['2','3','4']})
f.columns = [['level1 item1', 'level1 item2'],['', 'level2 item2'], ['level3 item1', 'level3 item2']]
f
Out[51]:
level1 item1 level1 item2
level2 item2
level3 item1 level3 item2
0 1 2
1 2 3
2 3 4
Бывает, что при выборе level1 item1
возникает следующая ошибка:
In [58]: f['level1 item1']
AssertionError: Index length did not match values
Однако, похоже, это несколько связано с количеством уровней. Когда я уменьшаю количество уровней до двух, такой ошибки нет:
from pandas import DataFrame
f = DataFrame({'a': ['1','2','3'], 'b': ['2','3','4']})
f.columns = [['level1 item1', 'level1 item2'],['', 'level1 item2']]
f
Out[59]:
level1 item1 level1 item2
level1 item2
0 1 2
1 2 3
2 3 4
Вместо этого предыдущий DataFrame дает ожидаемую серию:
In [63]:
f['level1 item1']
Out[63]:
0 1
1 2
2 3
Name: level1 item1
Заполнение пробела ниже level1 item1
фиктивным символом "исправляет" эту проблему, но это не очень хорошее решение.
Как я могу исправить эту проблему, не прибегая к заполнению этих столбцов фиктивными именами?
Спасибо большое!
Исходный пример:
Эта таблица была создана с использованием следующих индексов:
index = [np.array(['Size and accumulated size of adjusted gross income', 'All returns', 'All returns', 'All returns', 'All returns', 'All returns', 'Taxable returns', 'Taxable returns', 'Taxable returns', 'Taxable returns', 'Taxable returns', 'Taxable returns', 'Taxable returns', 'Taxable returns', 'Taxable returns', 'Taxable returns', 'Taxable returns', 'Taxable returns', 'Taxable returns', 'Taxable returns', 'Taxable returns']),
np.array(['', 'Number of returns', 'Percent of total', 'Adjusted gross income less deficit', 'Adjusted gross income less deficit', 'Adjusted gross income less deficit', 'Number of returns', 'Percent of total', 'Adjusted gross income less deficit', 'Adjusted gross income less deficit', 'Taxable income', 'Taxable income', 'Taxable income', 'Income tax after credits', 'Income tax after credits', 'Income tax after credits', 'Total income tax', 'Total income tax', 'Total income tax', 'Total income tax', 'Total income tax']),
np.array(['', '', '', '', '', '', '', '','', '', 'Number of returns', 'Amount', 'Percent of total', 'Number of returns', 'Amount', 'Percent of total', 'Amount', 'Percent of', 'Percent of', 'Percent of', 'Average total income tax (dollars)']),
np.array(['', '', '', 'Amount', 'Percent of total', 'Average (dollars)', 'Average (dollars)', 'Average (dollars)', 'Amount', 'Percent of total', 'Percent of total', 'Percent of total', 'Percent of total', 'Percent of total', 'Percent of total', 'Percent of total', 'Percent of total', 'Total', 'Taxable income', 'Adjusted gross income less deficit', 'Adjusted gross income less deficit'])]
df.columns = index
Это почти идеальная копия некоторых данных в CSV файле, но вы можете видеть, что ниже "Количество возвратов", "Процент от общего числа" и "Скорректированный валовой доход с меньшим дефицитом" есть пробел. Этот пробел вызывает эту ошибку, когда я пытаюсь выбрать Number of returns:
In [68]: df['Taxable returns']['Number of returns']
AssertionError: Index length did not match values
Я не понимаю эту ошибку. Поэтому хорошее объяснение будет высоко оценено. В любом случае, когда я заполняю этот пробел, используя этот индекс (обратите внимание на первые элементы в третьем массиве numpy):
index = [np.array(['Size and accumulated size of adjusted gross income', 'All returns', 'All returns', 'All returns', 'All returns', 'All returns', 'Taxable returns', 'Taxable returns', 'Taxable returns', 'Taxable returns', 'Taxable returns', 'Taxable returns', 'Taxable returns', 'Taxable returns', 'Taxable returns', 'Taxable returns', 'Taxable returns', 'Taxable returns', 'Taxable returns', 'Taxable returns', 'Taxable returns']),
np.array(['', 'Number of returns', 'Percent of total', 'Adjusted gross income less deficit', 'Adjusted gross income less deficit', 'Adjusted gross income less deficit', 'Number of returns', 'Percent of total', 'Adjusted gross income less deficit', 'Adjusted gross income less deficit', 'Taxable income', 'Taxable income', 'Taxable income', 'Income tax after credits', 'Income tax after credits', 'Income tax after credits', 'Total income tax', 'Total income tax', 'Total income tax', 'Total income tax', 'Total income tax']),
np.array(['1', '2', '3', '4', '5', '6', '7', '8','9', '10', 'Number of returns', 'Amount', 'Percent of total', 'Number of returns', 'Amount', 'Percent of total', 'Amount', 'Percent of', 'Percent of', 'Percent of', 'Average total income tax (dollars)']),
np.array(['', '', '', 'Amount', 'Percent of total', 'Average (dollars)', 'Average (dollars)', 'Average (dollars)', 'Amount', 'Percent of total', 'Percent of total', 'Percent of total', 'Percent of total', 'Percent of total', 'Percent of total', 'Percent of total', 'Percent of total', 'Total', 'Taxable income', 'Adjusted gross income less deficit', 'Adjusted gross income less deficit'])]
df.columns = index
Я получаю правильные результаты:
In [71]: df['Taxable returns']['Number of returns']
Out[71]:
7
Average (dollars)
0 90,660,104
1 3,495
...