2015-12-07 1 views
2

C'était mon essai. Par exemplePrenez le maximum en valeur absolue de différentes colonnes et filtrez NaN Python

df = pd.DataFrame({'a':[5,0,1,np.nan], 'b':[np.nan,1,4,3], 'c':[-3,-2,0,0]}) 
df.dropna(axis=1).max(axis=1,key=abs) 

Filtres à bien les NaN valeurs mais il obtient 0 ou des valeurs négatives au lieu des highes en valeur absolue

Le résultat devrait être une colonne avec

5 
-2 
4 
3 
+0

quand vous faites 'dropna' vous perdre toutes les colonnes avec' valeurs NaN' et seule colonne 'C' est laissé –

+0

Ok. En tout cas si j'utilise df.max (axe = 1, clé = abs) il ne prend pas le maximum en valeur absolue, mais juste le positif max – gis20

Répondre

0

Vous pouvez utiliser np.nanargmax sur les données au carré:

>>> df.values[range(df.shape[0]),np.nanargmax(df**2,axis=1)] 
array([ 5., -2., 4., 3.]) 
0
df = df.fillna(0) 
l = df.abs().values.argmax(axis=1) 
pd.Series([df.values[i][l[i]] for i in range(len(df.values))]) 

In [532]: pd.Series([df.values[i][l[i]] for i in range(len(df.values))]) 
Out[532]: 
0 5 
1 -2 
2 4 
3 3 
dtype: float64 

Une doublure:

pd.Series([df.values[i][df.fillna(0).abs().values.argmax(axis=1)[i]] for i in range(len(df.values))]) 
6

Je résolu par

maxCol=lambda x: max(x.min(), x.max(), key=abs) 
df.apply(maxCol,axis=1)