2016-03-05 7 views
5

Im einen Datenrahmen in einer Reihe, die, vereinfacht unter Verwendung von Code zu konvertieren versuchen, sieht wie folgt aus:pandas.Series() Erstellung unter Verwendung von Datenrahmen Spalten liefert NaN Dateneinträge

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) 

jedoch Druckausgabe wie folgt aussieht:

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 Sicht auf ein Objekt DataFrame kein gültiger Eingang für die Klasse Series?

I have found the to_series function für pd.Index Objekte, gibt es etwas ähnliches für DataFrame s?

+0

Beginnen Sie mit dem Datenrahmen oder ist das nur ein Zwischenschritt? –

+0

Beginnend mit einem Datenrahmen - weshalb ich es nicht sofort in eine Serie aufgenommen habe; Die Daten werden aus einer CSV mit mehreren Spalten geladen. – nlsdfnbch

+0

Ah okay. Sie können also meine Antwort ignorieren. –

Antwort

9

Ich glaube, Sie values verwenden können, es Spalte Value zu Array 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 können Sie:

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 

Dankewarumfür eine bessere Erklärung Sie erhalten NaN:

Wenn Sie geben eine Series oder DataFrame Spalte pd.Series, wird es indizieren es mit der index Sie angeben. Da Ihre DataFrame Spalte eine Ganzzahl index (keine date index) hat, erhalten Sie viele fehlende Werte.

+0

Und so kann ich! Prost, Kumpel! – nlsdfnbch

+0

Aus Neugier, von was konvertiert es die Daten in die Liste? Ich dachte immer, ich könnte an die zurückgegebenen Werte von 'df [' Date '] 'als iterierbar, vergleichbar mit Listen, denken - ist das nicht der Fall? – nlsdfnbch

+2

@ j4ck: Wenn Sie eine 'Series' - oder 'Dataframe'-Spalte an 'pd.Series' übergeben, * wird sie * neu indiziert, indem sie den von Ihnen angegebenen Index verwendet. Da Ihre DataFrame-Spalte einen ganzzahligen Index hat (kein Datumsindex). Sie erhalten viele fehlende Werte. –

0

Wenn Sie nur auf der Suche nach einer Reihe zu schaffen, mit diesen Werten Sie auch getan haben könnte:

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

Sie können einfach tun:

s = df.set_index('Date') 

die nun eine eine Spalte Datenrahmen ist.

Wenn Sie es als eine Reihe wirklich:

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

btw, NaN numpy ist ist nicht-a-Nummer.

Ihre Methode verwenden, könnten Sie verwenden:

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

Der Grund, warum Sie die NaNs bekommen ist, dass Sie nicht die Daten im richtigen Format zur Verfügung stellen. Sie übergeben eine Serie an eine Serie.

Verwandte Themen