web-dev-qa-db-de.com

pandas.Series () Die Erstellung mit DataFrame Columns gibt NaN-Dateneinträge zurück

Ich versuche, ein Datenframe mit Hilfe von Code in eine Serie zu konvertieren, die vereinfacht so aussieht:

dates = ['2016-1-{}'.format(i)for i in range(1,21)]
values = [i for i in range(20)]
data = {'Date': dates, 'Value': values}
df = pd.DataFrame(data)
df['Date'] = pd.to_datetime(df['Date'])
ts = pd.Series(df['Value'], index=df['Date'])
print(ts)

Die Druckausgabe sieht jedoch so aus:

Date
2016-01-01   NaN
2016-01-02   NaN
2016-01-03   NaN
2016-01-04   NaN
2016-01-05   NaN
2016-01-06   NaN
2016-01-07   NaN
2016-01-08   NaN
2016-01-09   NaN
2016-01-10   NaN
2016-01-11   NaN
2016-01-12   NaN
2016-01-13   NaN
2016-01-14   NaN
2016-01-15   NaN
2016-01-16   NaN
2016-01-17   NaN
2016-01-18   NaN
2016-01-19   NaN
2016-01-20   NaN
Name: Value, dtype: float64

Woher kommt NaN? Ist eine Ansicht eines DataFrame-Objekts keine gültige Eingabe für die Series-Klasse?

Ich habe die Funktion to_series gefunden für pd.Index-Objekte. Gibt es etwas Ähnliches für DataFrames?

6
nlsdfnbch

Ich denke, Sie können values verwenden, um die Spalte Value in ein Array zu konvertieren:

ts = pd.Series(df['Value'].values, index=df['Date'])
import pandas as pd
import numpy as np
import io

dates = ['2016-1-{}'.format(i)for i in range(1,21)]
values = [i for i in range(20)]
data = {'Date': dates, 'Value': values}
df = pd.DataFrame(data)
df['Date'] = pd.to_datetime(df['Date'])
print df['Value'].values
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]

ts = pd.Series(df['Value'].values, index=df['Date'])
print(ts)
Date
2016-01-01     0
2016-01-02     1
2016-01-03     2
2016-01-04     3
2016-01-05     4
2016-01-06     5
2016-01-07     6
2016-01-08     7
2016-01-09     8
2016-01-10     9
2016-01-11    10
2016-01-12    11
2016-01-13    12
2016-01-14    13
2016-01-15    14
2016-01-16    15
2016-01-17    16
2016-01-18    17
2016-01-19    18
2016-01-20    19
dtype: int64

Oder Sie können verwenden:

ts1 = pd.Series(data=values, index=pd.to_datetime(dates))
print(ts1)
2016-01-01     0
2016-01-02     1
2016-01-03     2
2016-01-04     3
2016-01-05     4
2016-01-06     5
2016-01-07     6
2016-01-08     7
2016-01-09     8
2016-01-10     9
2016-01-11    10
2016-01-12    11
2016-01-13    12
2016-01-14    13
2016-01-15    14
2016-01-16    15
2016-01-17    16
2016-01-18    17
2016-01-19    18
2016-01-20    19
dtype: int64

Vielen Dank @ajcr für eine bessere Erklärung, warum Sie NaN bekommen:

Wenn Sie eine Series- oder DataFrame-Spalte für pd.Series angeben, wird diese mit der von Ihnen angegebenen index neu indiziert. Da Ihre DataFrame-Spalte eine ganze Zahl index (kein date index) enthält, werden viele fehlende Werte angezeigt.

15
jezrael

Wenn Sie nur nach einer Serie mit diesen Werten suchen, könnten Sie auch Folgendes tun: 

 pd.Series( [i for i in range(20)],  pd.date_range('2016-01-02', periods=20, freq='D'))
0
k-nut

Sie können einfach tun:

s = df.set_index('Date')

Welches ist jetzt ein Datenframe mit einer Spalte.

Wenn Sie es wirklich als Serie haben wollen:

s = df.set_index('Date').Value

Übrigens ist NaN die Not-a-Number von numpy.

Mit Ihrer Methode können Sie Folgendes verwenden:

ts = pd.Series(df['Value'].values, name='Value', index=df['Date'])

Der Grund, warum Sie die NaNs erhalten, ist, dass Sie die Daten nicht im richtigen Format bereitstellen. Sie übergeben eine Serie an eine Serie.

0
Alexander