ValueError: операнды не могут быть переданы вместе с формой при вызове pands value_counts () для объекта groupby - PullRequest
0 голосов
/ 28 февраля 2019

Я знаю, что было много вопросов об этом сообщении об ошибке.Однако я не нашел ни одного с этой точной проблемой.

Я пытаюсь сгруппировать DataFrame панд и посчитать значения:

allfactor = dataframe.groupby(factor)[reference_area].value_counts()

, где factor и reference_area являются именами столбцов вdataframe.Это работает для некоторых столбцов, таких как DGD015, но не для некоторых других, включая фактор.
Это дает мне ошибку:

ValueError: operands could not be broadcast together with shape (421,) (419,)

Я помещу полное сообщение об ошибке в конце этоговопрос.
Сама группировка работает:

In: grouped = data.groupby(factor)[reference_area]
    grouped
Out: <pandas.core.groupby.generic.SeriesGroupBy object at 0x0000000B39D0F5F8>

Я вижу, что это ошибочная широковещательная ошибка, возникающая из-за того, что размеры не имеют одинаковую форму.И для этого есть обходные пути, такие как [:, np.newaxis] ( Research Computing for Earth Sciences * ) или [:,None] ( Как мыслить как ученый-компьютерщик: Обучение на Python 3 )при попытке умножить измерения, которые «не подходят» и из которых нельзя вытянуть ни одного.

Однако я не знаю, как это сделать, когда ошибка возникает в numpy, который вызывается пандами,который вызывается путем вызова value_counts ().

У кого-нибудь есть идея для обхода здесь?

Как я могу получить здесь numpy, чтобы сказать ему просто добавить новые оси, содержащие NAN, чтобы сделатьразмеры соответствуют?

Вот полное сообщение об ошибке:

ValueError          Traceback (most recent call last)
ipython-input-5-013b5262b34f> in module>()
----> 1 trial = get_positives_threshold(data, 'SHB23D', 'HV001', threshold=90)
      2 print(trial)
ipython-input-3-80d69965e883> in get_positives_threshold(dataframe, factor, reference_area, threshold)
---> 33         allfactor = dataframe.groupby(factor)[reference_area].value_counts()
~\Documents\anaconda3\lib\site-packages\pandas\core\groupby\generic.py in value_counts(self, normalize, sort, ascending, bins, dropna)
-> 1139         labels = list(map(rep, self.grouper.recons_labels)) + [llab(lab, inc)]`
`~\Documents\anaconda3\lib\site-packages\numpy\core\fromnumeric.py in repeat(a, repeats, axis)
    421     repeated_array : ndarray
    422         Output array which has the same shape as a, except along
--> 423         the given axis.
~\Documents\anaconda3\lib\site-packages\numpy\core\fromnumeric.py in _wrapfunc(obj, method, *args, **kwds)
     50     try:
     51         return getattr(obj, method)(*args, **kwds)
---> 52 
     53     # An AttributeError occurs if the object does not have
     54     # such a method in its class.`


ValueError: operands could not be broadcast together with shape (421,) (419,)

Вот некоторая информация о кадре данных:

Изначально был SPSS-файл .sav, который был преобразован в перофайл.Затем это было прочитано с помощью pandas.read_feather (path_to_file).Данные всего столбца относятся к категории dtype.Исходные значения большинства столбцов содержат NaN, целые числа как строки и строки, но все они хранятся как категориальные.

  reference_area   HV002   HV003  [...] DGD015    [...] factor    [...]
1 '10001'          'NaN'   'Yes'  [...] 'Refused' [...] '90'      [...]
2 '10001'          'No'    'NaN'  [...] '140'     [...] '80'      [...]
3 '24736'          'Yes'   'No'   [...] '78'      [...] 'Nan'     [...]
4 '24736'          'Yes'   'No'   [...] 'Other'   [...] 'Technical Problem'

Значения являются репрезентативными, но смешанные, а имена столбцов изменены для маскирования исходных данных.

Pandas версия 0.24.1
Numpy версия 1.15.4
Python версия 3.6.5
Работа с Anaconda 3 в ноутбуке jupyter с указанными версиями в моей среде.

Ожидаемый результат:

In: dataframe.groupby(factor)[reference_area].value_counts()
Out: factor  reference_area 
0                  121640.0     1
1                  52675.0      1
                   181826.0     1
10                 40812.0      1
                   340804.0     2
                   360756.0     1
100                70679.0     18
                   70251.0     14
                   70019.0     13
                   70728.0     11
                   120070.0    11
                               ..
Refused            90008.0      1

1 Ответ

0 голосов
/ 05 марта 2019

Проблема, кажется, с ненаблюдаемыми категориями.Из документации Pandas по groupby:

При использовании категориального группировщика (в качестве отдельного группировщика или в составе нескольких группировщиков) наблюдаемое ключевое слово определяет, следует ли возвращать декартово произведение всех возможных значений группировщиков.(наблюдаемый = ложный) или только те, которые наблюдаются сгруппированными (наблюдаемый = истинный).

Расчет декартового произведения в моем конкретном случае в конечном итоге приводит к ошибке вещания.Вот почему некоторые столбцы работают, а другие нет: у тех столбцов, которые работают, нет никаких ненаблюдаемых категорий, в то время как у тех, которые не работают, есть ненаблюдаемые категории.

Чтобы избежать проблем с этим, установите observed = True, когдагруппировка.Это означает, что groupby будет использовать только наблюдаемые категории (то есть те категории, для которых существуют записи).В моем случае это будет:
allfactor = dataframe.groupby(factor, observed=True)[reference_area].value_counts()

Насколько показывают мои тесты, это не приводит к потере записей кадра данных для дальнейшего анализа.Нет записей для ненаблюдаемых категорий (даже со значениями NaN), поэтому мы не теряем записей при использовании только наблюдаемых категорий.Имейте в виду, что если вы хотите проанализировать эти ненаблюдаемые категории, это не то решение, которое вы ищете.

...