有人可以解释为什么我在同时是数字数据类型的'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跟踪(最近的呼叫 持续) /anaconda3/lib/python3.6/site-packages/pandas/core/indexes/multi.py在 get_value(自身,系列,键) 999尝试: -> 1000返回libindex.get_value_at(s,k)1001,除了IndexError:
pandas._libs.index.get_value_at()中的pandas / _libs / index.pyx
util.get_value_at()中的pandas / _libs / src / util.pxd
TypeError:“ str”对象不能解释为整数
在处理上述异常期间,发生了另一个异常:
KeyError跟踪(最近的呼叫 最后)在() ----> 1 y1.apply(lambda v:linregress(v ['day'],v ['value'])) 2
KeyError :(“天”,“发生在索引实体上”)
答案 0 :(得分:0)
更新,那么您需要这样做:
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
我认为您所要做的就是这样做,不需要应用,只需将两个dataframe列传递给linregress
:
linregress(y1['day'],y1['value'])
输出:
LinregressResult(slope=0.29073482428115016, intercept=-579.2396166134187, rvalue=0.7502746874224853, pvalue=0.14406233411953523, stderr=0.1479110164470003)
答案 1 :(得分:0)
请注意documentation for linregress调用类似数组的类型。
类似数组的类型在这里表示可以强制为NumPy数组的任何数据结构。这包括Pandas系列(我们可以通过在其中一个调用np.array
来显示这一点)。
因此,您可以直接在数据框列上调用linregress
,而无需在此处申请。也就是说,您可以将代码的最后一行替换为
df = y[y['entity'].isin(mylist)]
linregress(df['day'], df['value'])
Pandas和Python数据生态系统中的许多库的优势在于它们可以很好地配合使用,并且它们array-oriented,这意味着它们已针对数组和其他大型可迭代数据结构(相对于标量)的操作进行了优化。值,因此在大多数情况下,它们的方法默认情况下采用那些数据结构,而无需您显式调用apply
,map
和其他函数。
另一个注意事项:您看到的类型错误是Pandas内部的堆栈跟踪。最新的跟踪以及导致问题的直接原因位于底部。