ValueError при использовании многоуровневой суммы в Pandas DataFrame с пустыми столбцами - PullRequest
0 голосов
/ 07 января 2019

Значительно обновленный вопрос : Я обнаружил проблему, вызвавшую ошибку: Фрейм данных содержит несколько пустых столбцов. Добавлен воспроизводимый пример.

У меня есть Pandas DataFrame, который выглядит так, но гораздо больше (2500x288):

df = pd.DataFrame(np.random.randn(3, 8),
                  columns=pd.MultiIndex.from_arrays((['A','A','A', 'A', 'B', 'B', 'B', 'B'], 
                                                     ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'], 
                                                     ['i', 'ii', 'i', 'ii', 'i', 'ii', 'i', 'ii'])))


          A                                       B                              
          a         b         c         d         a         b         c         d
          i        ii         i        ii         i        ii         i        ii
0 -0.344673  0.711897 -1.306805 -1.926644 -0.351334 -0.864423 -1.023401 -0.284710
1  0.730107  0.245481 -0.570591  1.740258  0.779193 -0.151460  2.082086 -0.008099
2 -0.806092 -1.364315  0.845041  1.739843  0.737802 -2.232088  0.114731 -1.028346

Теперь я хотел бы суммировать его по двум уровням столбцов MultiIndex, например:

df.sum(level=[1,2], axis=1)

          a         b         c         d
          i        ii         i        ii
0 -0.696007 -0.152525 -2.330206 -2.211354
1  1.509300  0.094021  1.511495  1.732159
2 -0.068290 -3.596403  0.959772  0.711497

Однако, как только столбцы пусты, возникает ValueError.

df.loc[:, ('A','b','ii')] = None
df.sum(level=[1,2], axis=1)

ValueError: No axis named 1 for object type <class 'pandas.core.series.Series' 

Работа с одноуровневыми суммами (например, df.sum(level=1, axis=1)). Также работает с использованием transpose(), например, df.transpose().sum(level=[1,2], axis=0).transpose(), хотя это невероятно медленно. Это говорит мне, что это может быть скорее ошибкой, а не тем, что я «делаю это неправильно».

Использование df.groupby(level=[1,2], axis=1).sum() дает ту же ошибку.

1 Ответ

0 голосов
/ 08 января 2019

Можно использовать .fillna(). Однако это скорее обходной путь, и я бы предпочел сохранить None значения ... Приветствуются лучшие решения!

df.fill(0).sum(level=[1,2], axis=1)

Это ошибка в пандах 0.23.4: https://github.com/pandas-dev/pandas/issues/24671

...