wake-up-neo.net

Konvertieren Sie den Pandas-Datenrahmen in eine Serie

Ich bin etwas neu bei Pandas. Ich habe einen Pandas-Datenrahmen, der aus einer Zeile mit 23 Spalten besteht.

Ich möchte das in eine Serie umwandeln? Ich frage mich, was der pythonischste Weg ist, dies zu tun?

Ich habe pd.Series(myResults) versucht, aber es beschwert sich ValueError: cannot copy sequence with size 23 to array axis with dimension 1. Es ist nicht intelligent genug, um zu erkennen, dass es in Mathematik immer noch ein "Vektor" ist. 

Vielen Dank!

44
user1357015

Es ist nicht intelligent genug, um zu erkennen, dass es in Mathematik immer noch ein "Vektor" ist.

Sagen Sie eher, dass es klug genug ist, einen Unterschied in der Dimensionalität zu erkennen. :-)

Ich denke, das einfachste, was Sie tun können, ist diese Zeile positionell mit iloc auszuwählen, wodurch Sie eine Reihe mit den Spalten als neuen Index und den Werten als Werten erhalten.

>>> df = pd.DataFrame([list(range(5))], columns=["a{}".format(i) for i in range(5)])
>>> df
   a0  a1  a2  a3  a4
0   0   1   2   3   4
>>> df.iloc[0]
a0    0
a1    1
a2    2
a3    3
a4    4
Name: 0, dtype: int64
>>> type(_)
<class 'pandas.core.series.Series'>
34
DSM

Sie können den einzeiligen Datenrahmen (der immer noch zu einem Datenrahmen führt) und dann squeeze die Ergebnisse in eine Reihe umwandeln (die Umkehrung von to_frame).

df = pd.DataFrame([list(range(5))], columns=["a{}".format(i) for i in range(5)])

>>> df.T.squeeze()  # Or more simply, df.squeeze() for a single row dataframe.
a0    0
a1    1
a2    2
a3    3
a4    4
Name: 0, dtype: int64

Note: Um den von @IanS hervorgehobenen Punkt aufzunehmen (auch wenn er nicht in der OP-Frage steht), prüfen Sie die Größe des Datenrahmens. Ich gehe davon aus, dass df ein Datenrahmen ist, aber die Edge-Fälle sind ein leerer Datenrahmen, ein Datenrahmen der Form (1, 1) und ein Datenrahmen mit mehr als einer Zeile. In diesem Fall sollte der Benutzer die gewünschte Funktionalität implementieren.

if df.empty:
    # Empty dataframe, so convert to empty Series.
    result = pd.Series()
Elif df.shape == (1, 1)
    # DataFrame with one value, so convert to series with appropriate index.
    result = pd.Series(df.iat[0, 0], index=df.columns)
Elif len(df) == 1:
    # Convert to series per OP's question.
    result = df.T.squeeze()
else:
    # Dataframe with multiple rows.  Implement desired behavior.
    pass

Dies kann auch entsprechend der Antwort von @themachinist vereinfacht werden.

if len(df) > 1:
    # Dataframe with multiple rows.  Implement desired behavior.
    pass
else:
    result = pd.Series() if df.empty else df.iloc[0, :]
26
Alexander

Sie können die Serie abrufen, indem Sie Ihren Datenrahmen mit einer der beiden folgenden Methoden aufteilen:

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.iloc.htmlhttp://pandas.pydata.org/pandas-docs/stable/ generiert/pandas.DataFrame.loc.html

import pandas as pd
import numpy as np
df = pd.DataFrame(data=np.random.randn(1,8))

series1=df.iloc[0,:]
type(series1)
pandas.core.series.Series
20
themachinist

Ein anderer Weg -

Angenommen, myResult ist der dataFrame, der Ihre Daten in der Form von 1 Spalte und 23 Zeilen enthält

// label your columns by passing a list of names
myResult.columns = ['firstCol']

// fetch the column in this way, which will return you a series
myResult = myResult['firstCol']

print(type(myResult))

Auf ähnliche Weise können Sie Serien von Dataframe mit mehreren Spalten erhalten.

0
Tauseef Malik