2017-09-07 3 views
1

df = rocksfile snapshot of my dataframefonction Pandas .Appliquer() avec plusieurs args

Question: Écrivez une fonction qui prend une ligne d'une trame de données et imprimer la chanson, artiste, et si la date de sortie ou non < 1970.

Définir ma fonction:

def release_info(row): 
    """Checks if song is released before or after 1970.""" 
    if rocksfile.loc[row, 'Release_Year'] < 1970: 
     print str(rocksfile.loc[row,'Song_Clean']) + " by " + 
str(rocksfile.loc[row,'Artist_Clean']) \ 
      + " was released before 1970." 
    else: 
     print str(rocksfile.loc[row,'Song_Clean']) + " by " + str(rocksfile.loc[row,'Artist_Clean']) \ 
      + " was released after 1970." 

Utilisation de la fonction .Appliquer(), appliquer la fonction que vous avez écrit aux quatre premières lignes de la trame de données. Vous devrez indiquer à la fonction d'application de fonctionner ligne par ligne. La définition de l'argument mot-clé en tant qu'axe = 1 indique que la fonction doit être appliquée à chaque ligne individuellement.

En utilisant .Appliquer:

rocksfile.apply(release_info, axis = 1, row=1) 

Message d'erreur:

TypeError         Traceback (most recent call last) 
<ipython-input-61-fe0405b4d1e8> in <module>() 
    1 #a = [1] 
    2 
----> 3 rocksfile.apply(release_info, axis = 1, row=1) 


TypeError: ("release_info() got multiple values for keyword argument 'row'", u'occurred at index 0') 

release_info (1)

Répondre

0

Vous pouvez utiliser np.where et réduire cela à 1 ligne.

s = rocksfile['Song_Clean'] 
    + ' was released by ' 
    + rocksfile['Artist_Clean'] 
    + pd.Series(np.where(rocksfile['Release_Year'] < 1970, 'before', 'after')) 
    + ' 1970' 

rocksfile['new'] = s 
1

En pandas géants travaillant avec array s (Series, DataFrames) afin de mieux est utilisé vectorisé pandas ou numpy fonction, ici le meilleur est l'utilisation numpy.where:

#condition 
m = rocksfile['Release_Year'] < 1970 
#concatenate columns together 
a = rocksfile['Song_Clean'] + " by " + rocksfile['Artist_Clean'] 
#add different string to end 
b = a + " was released before 1970." 
c = a + " was released after 1970." 

rocksfile['new'] = np.where(m, a, b) 
print (rocksfile) 
0

ici:

rocksfile.apply(release_info, axis = 1, row=1) 

row ne fait pas partie de DataFrame.apply() arguments attendus, de sorte it get passed as a keyword arg-release_info(), en plus du premier argument de position, si release_info() finit par être appelé comme ceci:

release_info(row_index, row=1)