2017-06-15 7 views
1

Ich bin ein relativ neuer Benutzer von Pandas und benutze ihn, um Zeitreihen von BLS (Bureau of Labor Statistics) zu analysieren (heruntergeladen von ihrer FTP-Site). Aber ich stieß auf ein Problem, das ich in dem unten stehenden Python-Programm wiedergegeben habe:Möglicher Fehler in der Funktion pandas squeeze()

import pandas as pd 
import numpy as np 

yvals1 = np.array([10.]) 
yvals2 = np.array([10., 20.]) 

df1 = pd.DataFrame({"yvals": yvals1}) 
df2 = pd.DataFrame({"yvals": yvals2}) 

Der Inhalt der Datenframe-Objekte df1 und df2 ist wie erwartet:

df1: 
    yvals 
0 10.0 

df2: 
    yvals 
0 10.0 
1 20.0 

jedoch die Anwendung des Squeeze() -Methode gibt unterschiedliche Ergebnisse für df1 und df2.

df1.squeeze(): 
10.0 

f2.squeeze(): 
0 10.0 
1 20.0 
Name: yvals, dtype: float64 

Wie aus der Dokumentation zu erwarten, gibt df2.squeeze() eine Pandas Serie Objekt mit zwei Reihen, aber df1.squeeze() gibt einen skalaren numpy.float64 anstelle eines Objekts Panda-Serie mit einer Zeile. Dies muss ein Fehler sein und kein Feature, da eine Reihe mit 1 Reihe genauso behandelt werden sollte wie jede andere Reihe, wenn keine Vorinformation vorhanden ist.

Ich benutze Python 2.7.13 und Pandas 0.20.1. Vielen Dank im Voraus für jede Hilfe.

Antwort

3

Dies ist wie erwartet. squeeze ist die Beseitigung eine Dimension, wenn seine Größe 1

So Ihr Datenrahmen der Größe ist (2, 1)-(2,) und Ihr Datenrahmen der Größe zusammengedrückt wird (1, 1) wird auf einen Skalar gequetscht.

Um die erwarteten Ergebnisse, verwenden Sie den axis=1 Parameter

df1.squeeze(axis=1) 

0 10.0 
Name: yvals, dtype: float64 

Von Tooltip

Signature: df1.squeeze(axis=None) 
Docstring: 
Squeeze length 1 dimensions. 

Parameters 
---------- 
axis : None, integer or string axis name, optional 
    The axis to squeeze if 1-sized. 

    .. versionadded:: 0.20.0 

Returns 
------- 
scalar if 1-sized, else original object 
File:  //anaconda/envs/3.6/lib/python3.6/site-packages/pandas/core/generic.py 
Type:  method 
+0

Danke für die schnelle Antwort. Ich hätte erkennen sollen, dass 'squeeze()' jetzt ein 'axis' Argument hat. Es ist interessant, dass für eine einzelne Zeile die Vorgabe "axis = None" einen Skalar gibt, aber "axis = 0" und "axis = 1" beide ein Pandas Series-Objekt ergeben. Wie auch immer, danke nochmal; Du hast mir mehr zum Nachdenken gegeben. –

Verwandte Themen