Skip to content

Konvertieren von pandas.DataFrame, Series und numpy.ndarray ineinander

Python

pandas.DataFrame, pandas.Series und NumPy-Array numpy.ndarray können ineinander konvertiert werden.

  • Konvertieren Sie DataFrame, Serie in ndarray:values
  • Konvertieren Sie ndarray in DataFrame, Series
  • Hinweise zur Speicherfreigabe (ansehen und kopieren)
  • Pandas 0.24.0 oder höher:to_numpy()

Beachten Sie, dass pandas.DataFrame und pandas.Series auch über as_matrix() verfügen, das numpy.ndarray zurückgibt, aber seit Version 0.23.0 veraltet ist.

Im following Artikel erfahren Sie, wie Sie zwischen pandas.DataFrame, pandas.Series und der Liste der integrierten Python-Typen konvertieren.

Konvertieren Sie DataFrame, Serie in ndarray:values

Beide pandas.DataFrame als auch pandas.Series haben das Attributwerte, das das NumPy-Array numpy.ndarray zurückgibt. Nach Pandas 0.24.0 wird empfohlen, die am Ende dieses Artikels vorgestellte Methode to_numpy() zu verwenden.

pandas.DataFrame:

import numpy as np
import pandas as pd

df = pd.DataFrame(data=[[1, 2, 3], [4, 5, 6]], columns=['a', 'b', 'c'])
print(df)
#    a  b  c
# 0  1  2  3
# 1  4  5  6

a_df = df.values
print(a_df)
# [[1 2 3]
#  [4 5 6]]

print(type(a_df))
# <class 'numpy.ndarray'>

print(a_df.dtype)
# int64

pandas.Serie:

s = df['a']
print(s)
# 0    1
# 1    4
# Name: a, dtype: int64

a_s = s.values
print(a_s)
# [1 4]

print(type(a_s))
# <class 'numpy.ndarray'>

print(a_s.dtype)
# int64

Der Datentyp dtype von numpy.ndarray ist derselbe wie dtype der ursprünglichen pandas.DataFrame und pandas.Series.

df_f = pd.DataFrame([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]])
print(df_f)
#      0    1    2
# 0  0.1  0.2  0.3
# 1  0.4  0.5  0.6

a_df_f = df_f.values
print(a_df_f)
# [[0.1 0.2 0.3]
#  [0.4 0.5 0.6]]

print(type(a_df_f))
# <class 'numpy.ndarray'>

print(a_df_f.dtype)
# float64

Pandas.DataFrame mit einer Mischung aus Zahlen und Zeichenfolgen gibt ndarray zurück, dessen dtype Objekt ist.

df_multi = pd.read_csv('data/src/sample_pandas_normal.csv')
print(df_multi)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

a_df_multi = df_multi.values
print(a_df_multi)
# [['Alice' 24 'NY' 64]
#  ['Bob' 42 'CA' 92]
#  ['Charlie' 18 'CA' 70]
#  ['Dave' 68 'TX' 70]
#  ['Ellen' 24 'CA' 88]
#  ['Frank' 30 'NY' 57]]

print(type(a_df_multi))
# <class 'numpy.ndarray'>

print(a_df_multi.dtype)
# object

Weitere Informationen zum Objekttyp von ndarray finden Sie im following Artikel.

Wenn Sie Spalten extrahieren und Werte erhalten, können Sie nur bestimmte Spalten in ndarray konvertieren. Lesen Sie den following Artikel zum Extrahieren von Spalten.

Wenn SIE nur numerische Spalten auswählen, ist der Typ von ndarray this Typ anstelle von Objekt.

a_df_int = df_multi[['age', 'point']].values
print(a_df_int)
# [[24 64]
#  [42 92]
#  [18 70]
#  [68 70]
#  [24 88]
#  [30 57]]

print(type(a_df_int))
# <class 'numpy.ndarray'>

print(a_df_int.dtype)
# int64

Wenn Sie transponieren möchten, verwenden Sie T.

print(a_df_int.T)
# [[24 42 18 68 24 30]
#  [64 92 70 70 88 57]]

Sie können auch nur bestimmte Spaltentypen extrahieren. Wenn Sie beispielsweise nur int64-Spalten extrahieren möchten, können Sie Folgendes schreiben:

a_df_int = df_multi.select_dtypes(include=int).values
print(a_df_int)
# [[24 64]
#  [42 92]
#  [18 70]
#  [68 70]
#  [24 88]
#  [30 57]]

print(type(a_df_int))
# <class 'numpy.ndarray'>

print(a_df_int.dtype)
# int64

Weitere Informationen zum Extrahieren von Spalten nach dtype mit select_dtypes() finden Sie im following Artikel.

Sie können Zeilen/Spalten auch entsprechend ihrer Beschriftung extrahieren. Siehe folgenden Artikel.

Beachten SIE, dass der ursprüngliche pandas.DataFrame und convertnumpy.ndarray möglicherweise Speicher gemeinsam nutzen und das Ändern des einen den anderen ändern kann. Sie wird später beschrieben.

Konvertieren Sie ndarray in DataFrame, Series

Das NumPy-Array numpy.ndarray kann als erstes Argument data der Konstruktoren pandas.DataFrame und pandas.Series angegeben werden. Wie später beschrieben, teilen Sie sich numpy.ndarray und generierte pandas.DataFrame, pandas.Series Speicher.

pandas.String()

Wenn im Konstruktor keine anderen Argumente angegeben sind, handelt es sich um eine Serie des ursprünglichen ndarray-Typs.

import numpy as np
import pandas as pd

a = np.arange(4)
print(a)
# [0 1 2 3]

s = pd.Series(a)
print(s)
# 0    0
# 1    1
# 2    2
# 3    3
# dtype: int64

Sie können Index, Name, Dtype usw. angeben.

index = ['A', 'B', 'C', 'D']
name = 'sample'
s = pd.Series(data=a, index=index, name=name, dtype='float')
print(s)
# A    0.0
# B    1.0
# C    2.0
# D    3.0
# Name: sample, dtype: float64

Weitere Informationen zu dtype in Pandas finden Sie im following Artikel.

Die Angabe eines mehrdimensionalen Diagramms als Daten im Serien-Konstruktor führt zu einem Fehler.

a = np.arange(12).reshape((4, 3))
print(a)
# [[ 0  1  2]
#  [ 3  4  5]
#  [ 6  7  8]
#  [ 9 10 11]]

# s = pd.Series(a)
# print(s)
# Exception: Data must be 1-dimensional

Es ist möglich, Zeilen oder Spalten eines zweidimensionalen Darrays auszuwählen und sie in Serien umzuwandeln.

s = pd.Series(a[2])
print(s)
# 0    6
# 1    7
# 2    8
# dtype: int64

s = pd.Series(a.T[2])
print(s)
# 0     2
# 1     5
# 2     8
# 3    11
# dtype: int64

pandas.DataFrame()

Wie bei Series erhalten Sie einen DataFrame des ursprünglichen ndarray-Typs, wenn Sie keine Argumente im Konstruktor angeben.

a = np.arange(12).reshape((4, 3))
print(a)
# [[ 0  1  2]
#  [ 3  4  5]
#  [ 6  7  8]
#  [ 9 10 11]]

df = pd.DataFrame(a)
print(df)
#    0   1   2
# 0  0   1   2
# 1  3   4   5
# 2  6   7   8
# 3  9  10  11

Sie können Index, Spalten, dtype usw. angeben.

index = ['A', 'B', 'C', 'D']
columns = ['a', 'b', 'c']
df = pd.DataFrame(data=a, index=index, columns=columns, dtype='float')
print(df)
#      a     b     c
# A  0.0   1.0   2.0
# B  3.0   4.0   5.0
# C  6.0   7.0   8.0
# D  9.0  10.0  11.0

Hinweise zur Speicherfreigabe (ansehen und kopieren)

pandas.DataFrame oder pandas.Series und numpy.ndarray, die durch das value-Attribut oder den Konstruktor ineinander konvertiert wurden, can sich den Speicher teilen. Wenn der Speicher geteilt WIRD, ändert sich das. Ändern des einen den anderen. Seien Sie vorsichtig, wenn Sie sie einzeln verwenden möchten.

Der folgende Beispielcode und die Ergebnisse gelten für Pandas 0.25.1.

Werte-Attribut

Betrachten Sie zunächst den folgenden Fall.

df = pd.DataFrame(data=[[1, 2, 3], [4, 5, 6]], columns=['a', 'b', 'c'])
print(df)
#    a  b  c
# 0  1  2  3
# 1  4  5  6

a_values = df.values
print(a_values)
# [[1 2 3]
#  [4 5 6]]

Werte gibt eine Ansicht zurück; das eine ändert das andere. Dies kann mit np.shares_memory() überprüft werden.

print(np.shares_memory(a_values, df))
# True

a_values[0, 0] = 100
print(a_values)
# [[100   2   3]
#  [  4   5   6]]

print(df)
#      a  b  c
# 0  100  2  3
# 1    4  5  6

Es gibt nicht immer eine Ansicht zurück; Wenn beispielsweise jede Spalte einen anderen Datentyp hat, WIRD Eine Kopie zurückgegeben.

df_if = pd.DataFrame(data=[[1, 0.1], [2, 0.2]], columns=['int', 'float'])
print(df_if)
#    int  float
# 0    1    0.1
# 1    2    0.2

print(df_if.dtypes)
# int        int64
# float    float64
# dtype: object

a_values_if = df_if.values
print(a_values_if)
# [[1.  0.1]
#  [2.  0.2]]

print(np.shares_memory(a_values_if, df_if))
# False

a_values_if[0, 0] = 100
print(a_values_if)
# [[100.    0.1]
#  [  2.    0.2]]

print(df_if)
#    int  float
# 0    1    0.1
# 1    2    0.2

Außerdem hängt es bei der Auswahl eines Bereichs von der Spezifikationsmethode ab, ob die Ansicht oder die Kopie zurückerstattet WIRD.

print(df[['a', 'c']].values)
# [[100   3]
#  [  4   6]]

print(np.shares_memory(df[['a', 'c']].values, df))
# False

print(df.iloc[:, ::2].values)
# [[100   3]
#  [  4   6]]

print(np.shares_memory(df.iloc[:, ::2].values, df))
# True

Sie können explizit eine Kopie mit copy() von Werten erstellen.

a_values_copy = df.values.copy()
print(a_values_copy)
# [[100   2   3]
#  [  4   5   6]]

print(np.shares_memory(a_values_copy, df))
# False

a_values_copy[0, 0] = 10
print(a_values_copy)
# [[10  2  3]
#  [ 4  5  6]]

print(df)
#      a  b  c
# 0  100  2  3
# 1    4  5  6

pandas.DataFrame(), pandas.Series()

Wenn Sie numpy.ndarray an den Konstruktor pandas.DataFrame() oder pandas.Series() übergeben, teilen Sie sich zwei Objekte den Speicher. Das Ändern eines Werts ändert den anderen.

a = np.array([[1, 2, 3], [4, 5, 6]])
print(a)
# [[1 2 3]
#  [4 5 6]]

df_a = pd.DataFrame(a, columns=['a', 'b', 'c'])
print(df_a)
#    a  b  c
# 0  1  2  3
# 1  4  5  6

print(np.shares_memory(a, df_a))
# True

a[0, 0] = 100
print(a)
# [[100   2   3]
#  [  4   5   6]]

print(df_a)
#      a  b  c
# 0  100  2  3
# 1    4  5  6

df_a.iat[1, 0] = 10
print(df_a)
#      a  b  c
# 0  100  2  3
# 1   10  5  6

print(a)
# [[100   2   3]
#  [ 10   5   6]]

Wenn Sie den Speicher nicht teilen möchten, verwenden Sie copy() von numpy.ndarray.

df_a_copy = pd.DataFrame(a.copy(), columns=['a', 'b', 'c'])
print(df_a_copy)
#      a  b  c
# 0  100  2  3
# 1   10  5  6

a[0, 0] = 1
print(a)
# [[ 1  2  3]
#  [10  5  6]]

print(df_a_copy)
#      a  b  c
# 0  100  2  3
# 1   10  5  6

Pandas 0.24.0 oder höher:to_numpy()

Die Methode to_numpy() wurde pandas.DataFrame und pandas.Series in pandas 0.24.0 hinzugefügt. Diese Methode gibt numpy.ndarray zurück, wie das Attributwerte oben.

Die offizielle Dokumentation empfiehlt die Verwendung der Methode to_numpy() anstelle des Attributwertes, aber ab Version 0.25.1 gibt die Verwendung des Attributwertes keine Warnung aus.

df = pd.DataFrame(data=[[1, 2, 3], [4, 5, 6]], columns=['a', 'b', 'c'])
print(df)
#    a  b  c
# 0  1  2  3
# 1  4  5  6

a = df.to_numpy()
print(a)
# [[1 2 3]
#  [4 5 6]]

print(type(a))
# <class 'numpy.ndarray'>

Standardmäßig kann es, wie das Attributwerte, eine Ansicht zurückgeben (numpy.ndarray, die Speicher teilt).

print(np.shares_memory(df, a))
# True

a[0, 0] = 100
print(a)
# [[100   2   3]
#  [  4   5   6]]

print(df)
#      a  b  c
# 0  100  2  3
# 1    4  5  6

Das Setzen von Kopie auf True is a copy back. Der Standardwert ist copy=False.

a_copy = df.to_numpy(copy=True)
print(a_copy)
# [[100   2   3]
#  [  4   5   6]]

print(np.shares_memory(df, a_copy))
# False

a_copy[0, 0] = 10
print(a_copy)
# [[10  2  3]
#  [ 4  5  6]]

print(df)
#      a  b  c
# 0  100  2  3
# 1    4  5  6

Der Standardwert (copy=False) kann statt einer Ansicht eine Kopie zurückgeben. copy=True gibt immer eine Kopie zurück, aber copy=False gibt nicht immer eine Ansicht zurück.

Wenn das Attributwerte eine Kopie zurückgibt, gibt to_numpy(copy=False) auch eine Kopie zurück.

a_cols = df[['a', 'c']].to_numpy()
print(a_cols)
# [[100   3]
#  [  4   6]]

print(np.shares_memory(df, a_cols))
# False

Der Datentyp kann mit dem Parameter dtype angegeben werden. Eine Kopie wird auch zurückerstattet, wenn sich der Datentyp geändert hat.

a_f = df.to_numpy(dtype=float)
print(a_f)
# [[100.   2.   3.]
#  [  4.   5.   6.]]

print(np.shares_memory(df, a_f))
# False