2016-03-05 8 views
5

Im próbuje przekonwertować dataframe w szeregu za pomocą kodu, który uproszczone, wygląda następująco:pandas.Series() Utworzenie za pomocą DataFrame Kolumny zwraca NaN danych wjazdowe

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) 

jednak wydruk wygląda następująco:

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 

Skąd pochodzi NaN? Czy widok na obiekcie DataFrame nie jest prawidłowym wpisem dla klasy Series?

I have found the to_series function dla obiektów pd.Index, czy jest coś podobnego do DataFrame s?

+0

Czy zaczynasz od ramki danych, czy jest to tylko etap pośredni? –

+0

Począwszy od ramki danych - dlatego od razu nie umieszczałem jej w Serii; dane są ładowane z pliku CSV z wieloma kolumnami. – nlsdfnbch

+0

Ah w porządku. Więc możesz zignorować moją odpowiedź. –

Odpowiedz

9

myślę, że można użyć values, konwertować kolumnę Value do tablicy:

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 

Albo można użyć:

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 

Dziękuję @ajcr dla lepszego wyjaśnienia dlaczego masz NaN:

Kiedy dajesz kolumnę pd.SeriesSeries lub DataFrame, będzie go reindex pomocą index określić. Ponieważ twoja kolumna DataFrame ma liczbę całkowitą index (a nie date index) otrzymujesz wiele brakujących wartości.

+0

I mogę! Zdrowie przyjacielu! – nlsdfnbch

+0

Z ciekawości, z czego to przekształca dane na listę? Zawsze myślałem, że mogę myśleć o zwróconych wartościach 'df ['Date']' jako iterowalnych, porównywalnych do list - czy tak nie jest? – nlsdfnbch

+2

@ j4ck: Kiedy podasz kolumnę Series lub DataFrame do 'pd.Series', * * * zostanie ponownie zindeksowane * za pomocą określonego indeksu. Ponieważ twoja kolumna DataFrame ma indeks liczby całkowitej (nie jest to indeks daty). otrzymujesz wiele brakujących wartości. –

0

Jeśli szukasz tylko dla serii stworzenia z tych wartości można też zrobić:

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

Można po prostu zrobić:

s = df.set_index('Date') 

który jest obecnie dataframe jedna kolumna.

Jeśli naprawdę chcesz go jako seria:

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

btw, NaN jest numpy nie-a-Number.

Stosując metodę, można użyć:

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

Powodem otrzymujesz Nans jest to, że nie dostarczają danych w odpowiednim formacie. Przechodzisz serię do serii.

Powiązane problemy