输入数据帧示例如下:
y1 y2 y3 y4 y5 y6
2.3 2.8 2.9 2.8 2.3 2.2
2.9 3 3.1 2.9 2.8 3
1.7 2.2 2.1 2.1 1.7 1.8
2 2.2 2.1 2.1 1.9 2.1
我想计算每一行的线性回归,并运行代码:
import numpy as np
import pandas as pd
import scipy.stats as st
df=pd.read_excel(r'test.xlsx')
def lrg(y,p):
x=np.arange(1,7)
k,_,r,p,_=st.linregress(x,y) #return 5 element tupe, I choose 3 of them.
if p=='k':
return k
if p=='r':
return r
if p=='p':
return p
col=['y'+str(i) for i in range(1,7)]
df['r']=df[col].apply(lambda y:lrg(y,'r'),axis=1) # add values r as new column
为什么返回的df'r'列值为None?
df:
y1 y2 y3 y4 y5 y6 r
0 2.3 2.8 2.9 2.8 2.3 2.2 None
1 2.9 3.0 3.1 2.9 2.8 3.0 None
2 1.7 2.2 2.1 2.1 1.7 1.8 None
3 2.0 2.2 2.1 2.1 1.9 2.1 None
答案 0 :(得分:2)
使用参数p
,您将在函数内部重新分配。因此,将参数p
更改为其他内容。
def lrg(y,j):
x=np.arange(1,7)
k,_,r,p,_=st.linregress(x,y)
if j=='k':
return k
if j=='r':
return r
if j=='p':
return p
df['r'] = df[col].apply(lambda y: lrg(y,'r'),axis=1)
y1 y2 y3 y4 y5 y6 r 0 2.3 2.8 2.9 2.8 2.3 2.2 -0.356753 1 2.9 3.0 3.1 2.9 2.8 3.0 -0.152894 2 1.7 2.2 2.1 2.1 1.7 1.8 -0.237468 3 2.0 2.2 2.1 2.1 1.9 2.1 -0.207020
答案 1 :(得分:1)
您正在覆盖函数内p
的值。
def lrg(y, p): # <---- here
x=np.arange(1,7)
k,_,r,p,_=st.linregress(x,y) # <---- p redefined
...
更改名称,你应该很好。
您可以使用字典查找来合并代码。
x = np.arange(1, 7)
def lrg(y, p):
k, _, r, p2, _ = st.linregress(x, y)
vals = {'k' : k, 'r' : r, 'p' : p2}
return vals.get(p, np.nan)
col = ['y' + str(i) for i in range(1,7)]
df['r'] = df[col].apply(lambda y: lrg(y, 'r'), axis=1)
df
y1 y2 y3 y4 y5 y6 r
0 2.3 2.8 2.9 2.8 2.3 2.2 -0.356753
1 2.9 3.0 3.1 2.9 2.8 3.0 -0.152894
2 1.7 2.2 2.1 2.1 1.7 1.8 -0.237468
3 2.0 2.2 2.1 2.1 1.9 2.1 -0.207020
答案 2 :(得分:1)
你在这里覆盖变量p:
k,_,r,p,_=st.linregress(x,y) #return 5 element tupe, I choose 3 of them.
它不再具有赋予函数的值