Объект 'str' не может быть интерпретирован как целое число в groupby - PullRequest
0 голосов
/ 27 июня 2018

Может кто-нибудь объяснить, почему я получаю эту ошибку, когда делаю lingress (наклон) для 'day' и 'value', которые оба являются числовым типом данных. Ниже мой сценарий:

import pandas as pd
from scipy.stats import linregress
y = pd.DataFrame({'entity':['a','a','b','b','b','c'],
                          'day':[1999,2004,2003,2007,2014, 2016],
                          'value':[2,5,3,2,7,8]})
mylist= ['a', 'b'] 
y1 = y.groupby('entity').apply(lambda x: x[x['entity'].isin(mylist)])

В этой строке выдается ошибка:

y1.apply(lambda v: linregress(v['day'], v['value']))

ошибка трассировки:

TypeError Traceback (самый последний вызов прошлой) /anaconda3/lib/python3.6/site-packages/pandas/core/indexes/multi.py в get_value (self, series, key) 999 попробовать: -> 1000 вернуть libindex.get_value_at (s, k) 1001, кроме IndexError:

pandas / _libs / index.pyx в pandas._libs.index.get_value_at ()

pandas / _libs / src / util.pxd в util.get_value_at ()

TypeError: объект 'str' нельзя интерпретировать как целое число

Во время обработки вышеуказанного исключения произошло другое исключение:

KeyError Traceback (самый последний вызов последний) в () ----> 1 y1.apply (лямбда v: linregress (v ['day'], v ['value'])) 2 * * тысяча двадцать-один

KeyError: ('день', 'произошел в объекте индекса')

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Обратите внимание на документацию для linregress вызовов для ввода типа массива.

Под массивоподобным типом здесь подразумевается любая структура данных, которая может быть приведена в массив NumPy. Это включает в себя серию Pandas (мы можем показать это, позвонив по номеру np.array).

Таким образом, вы можете вызывать linregress непосредственно в столбцах данных, не нужно здесь применять. То есть вы можете заменить последнюю строку вашего кода на

df = y[y['entity'].isin(mylist)]
linregress(df['day'], df['value'])

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

Еще одно замечание: ошибка типа, которую вы видите, является трассировкой стека, внутренней по отношению к Pandas. Самый последний след и прямая причина вашей проблемы как внизу.

0 голосов
/ 27 июня 2018

Обновите, тогда вам нужно это:

y1.groupby(level='entity').apply(lambda x: linregress(x['day'],x['value']))

Выход:

entity
a                                                                 (0.6, -1197.3999999999999, 1.0, 0.0, 0.0)
b    (0.4032258064516129, -805.6774193548387, 0.8485552916276634, 0.35494576760559776, 0.25142673013096595)
dtype: object

Я думаю, все, что вам нужно, это сделать, вам не нужно подавать заявку, просто передайте два столбца данных в linregress:

linregress(y1['day'],y1['value'])

Выход:

LinregressResult(slope=0.29073482428115016, intercept=-579.2396166134187, rvalue=0.7502746874224853, pvalue=0.14406233411953523, stderr=0.1479110164470003)
...