2017-09-10 4 views
-1

L'entrée exemple dataframe comme suit:Pandas.DataFrame.apply retourne None valeurs

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 

Je veux calculer chaque ligne de régression linéaire, et exécuter du code:

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 

Pourquoi le retour df ' Les valeurs de la colonne r 'est 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 

Répondre

2

Son avec l'argument p vous réutilisez l'affectation dans la fonction . Changez donc l'argument p en autre chose.

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

Vous écrasez la valeur de p dans la fonction.

def lrg(y, p): # <---- here 
    x=np.arange(1,7) 
    k,_,r,p,_=st.linregress(x,y) # <---- p redefined 
    ... 

Changez le nom, et vous devriez être bon.


Vous pouvez utiliser une recherche de dictionnaire pour consolider un peu votre code.

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 
1

vous écrasez la variable p ici:

k,_,r,p,_=st.linregress(x,y) #return 5 element tupe, I choose 3 of them. 

Il est plus a la valeur qui a été donnée à la fonction