Pandas.DataFrame.apply返回None值

时间:2017-09-10 07:44:21

标签: python pandas dataframe apply

输入数据帧示例如下:

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

3 个答案:

答案 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.

它不再具有赋予函数的值