2017-09-10 3 views
10

Tenir compte de ce simple dataframe:Pourquoi est-pandas.DataFrame.apply impression indésirable?

a b 
0 1 2 
1 2 3 

je joue un .apply en tant que tel:

In [4]: df.apply(lambda x: [x.values]) 
Out[4]: 
a [[140279910807944, 140279910807920]] 
b [[140279910807944, 140279910807920]] 
dtype: object 

In [5]: df.apply(lambda x: [x.values]) 
Out[5]: 
a [[37, 37]] 
b [[37, 37]] 
dtype: object 

In [6]: df.apply(lambda x: [x.values]) 
Out[6]: 
a [[11, 11]] 
b [[11, 11]] 
dtype: object 

Pourquoi est l'impression des pandas géants ordure à chaque fois?

J'ai vérifié que cela se produit dans v0.20.

Éditer: Vous cherchez une réponse, pas une solution de contournement.

+1

Même avec 'df.apply (lambda x: [x])'. – DyZ

+0

Idem avec une trame de données à une ligne: 'df1 = pd.DataFrame ({'a': [1], 'b': [2]})' 'df1.apply (lambda x: [x], axis = 1) 'Sortie:' 0 [[0, 0]] ', – DyZ

+0

@DYZ Merci. Donc, ce n'était pas seulement ma machine qui jouait le fou. –

Répondre

8

Il ressemble à un bug, donc a été ouvert Issue 17487.

Pour moi travailler ajouter tolist:

print (df.apply(lambda x: [x.values.tolist()])) 
a [[1, 2]] 
b [[2, 3]] 
dtype: object 

print (df.apply(lambda x: [list(x.values)])) 
a [[1, 2]] 
b [[2, 3]] 
dtype: object 
+2

Oui ... la solution de contournement est correcte. Ma question est pourquoi? –

+1

Oui, bonne question - je n'en ai absolument aucune idée - mais ça a l'air d'un bug. – jezrael

+1

Merci d'avoir ouvert le problème. Si c'est vraiment un bug, je pense que c'est la seule façon de le savoir. –

6

Je n'ai pas de réponse ... juste un travail autour

f = lambda x: x.values.reshape(1, -1).tolist() 

df.apply(f) 

a [[1, 2]] 
b [[2, 3]] 
dtype: object 

Je l'ai poursuivi jusqu'à pd.lib.reduce

pd.lib.reduce(df.values, lambda x: [list(x)]) 

array([list([[1, 2]]), list([[2, 3]]), list([['a', 'b']])], dtype=object) 

Versus

pd.lib.reduce(df.values, lambda x: [x]) 

array([list([array([None, None], dtype=object)]), 
     list([array([None, None], dtype=object)]), 
     list([array([None, None], dtype=object)])], dtype=object) 
+0

Je vérifiais la même chose dans le code principal [code] [1] jusqu'à maintenant à partir de cette méthode '_apply_raw'. Je pensais que c'était le problème avec le type de données mélangé dans np.apply_along_axis. Mais c'est le "réduire". Vraiment sympa. [1]: https://github.com/pandas-dev/pandas/blob/3a7f956c30528736beaae5784f509a76d892e229/pandas/core/frame.py#L4280 – Dark

3

Un autre travail autour:

df.apply(lambda x: [list(x)])