Python - TypeError: Индексы кортежа должны быть целыми или кусочками, а не numpy.float64 - PullRequest
0 голосов
/ 20 июня 2019

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

finaltbl - это pandas df с col1prelim, col2prelim и col3prelim, значения которых находятся в диапазоне от 0 до 1 в формате с плавающей запятой.

finaltbl['col1'] = np.nan
finaltbl['col2'] = np.nan
finaltbl['col3'] = np.nan
coldict = {'col1':'col1prelim', 'col2':'col2prelim', 'col3':'col3prelim'}

for k, v in coldict.items():
    finaltbl.at[0, k] = 1
    finaltbl.at[1, k] = np.mean(finaltbl.loc[0, v], finaltbl.loc[1, v])

Возвращает TypeError: tuple indices must be integers or slices, not numpy.float64

Однако это работает:

for k, v in coldict.items():
    finaltbl.at[0, k] = 1
    finaltbl.at[1, k] = (finaltbl.loc[0, v] + finaltbl.loc[1, v])/2

Как мне изменить мой средний / средний расчет выше, чтобы работать? Позже мне нужно использовать 3 или 4 входа, а не 2, и я хотел бы иметь возможность использовать формулу среднего значения или что-то подобное.

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Когда вы выполняете numpy.mean () для этих значений, результат сохраняется во внутреннем типе Numpy numpy.float, который нельзя использовать в качестве индексатора. Вы должны привести свою переменную к и целому числу.

Для скалярных значений int () - это хорошо. Для float64 ndarrays вам нужно использовать метод astype () от Numpy.

0 голосов
/ 20 июня 2019

Создайте небольшой фрейм данных:

In [17]: df = pd.DataFrame(np.arange(12.).reshape(4,3))                                   
In [18]: df                                                                               
Out[18]: 
     0     1     2
0  0.0   1.0   2.0
1  3.0   4.0   5.0
2  6.0   7.0   8.0
3  9.0  10.0  11.0

Попробуйте использовать mean, как вы делаете, показывая полный возврат:

In [19]: np.mean(df.loc[0,1],df.loc[1,1])                                                 
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-19-19b913c69c93> in <module>
----> 1 np.mean(df.loc[0,1],df.loc[1,1])

/usr/local/lib/python3.6/dist-packages/numpy/core/fromnumeric.py in mean(a, axis, dtype, out, keepdims)
   3113             pass
   3114         else:
-> 3115             return mean(axis=axis, dtype=dtype, out=out, **kwargs)
   3116 
   3117     return _methods._mean(a, axis=axis, dtype=dtype,

/usr/local/lib/python3.6/dist-packages/numpy/core/_methods.py in _mean(a, axis, dtype, out, keepdims)
     60 
     61     is_float16_result = False
---> 62     rcount = _count_reduce_items(arr, axis)
     63     # Make this warning show up first
     64     if rcount == 0:

/usr/local/lib/python3.6/dist-packages/numpy/core/_methods.py in _count_reduce_items(arr, axis)
     53     items = 1
     54     for ax in axis:
---> 55         items *= arr.shape[ax]
     56     return items
     57 

TypeError: tuple indices must be integers or slices, not numpy.float64

Обратите внимание, что ошибка возникает при попытке использовать переменную оси. Если arr является массивом numpy, то arr.shape является кортежем. (1,2,3)[1.0] выдаст то же сообщение об ошибке.

Из np.mean документов:

Signature: np.mean(a, axis=None, ...)

первый аргумент - массив (или что-то, что можно превратить в массив). Вторым является значение оси - None, целое число или кортеж целых чисел. Вместо этого вы даете ему элемент вашего информационного кадра, очевидно, тот, который является плавающей точкой.

Так что вам нужно дать np.mean правильные аргументы. Например, список элементов dataframe:

In [22]: np.mean([df.loc[0,1],df.loc[1,1]])                                               
Out[22]: 2.5

===

Резюме:

  • посмотрите на полный трекбек и покажите его нам. Он может иметь ценные подсказки относительно того, что не так

  • читать документы функций, которые вы используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...