2016-03-05 81 views
5

林試圖將數據幀變換爲使用代碼,簡化的一個系列,看起來像這樣:pandas.Series(),使用數據幀列創建返回NaN數據條目

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) 

然而,打印輸出看起來像這樣:

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 

NaN從哪裏來? DataFrame對象上的視圖不是Series類的有效輸入嗎?

I have found the to_series function對於pd.Index對象,有沒有類似的東西DataFrame s?

+0

你是以數據框開始還是僅僅是一箇中間步驟? –

+0

從一個數據框開始 - 這就是爲什麼我沒有把它直接放在一個系列中;該數據是從多列CSV加載的。 – nlsdfnbch

+0

啊好的。所以你可以忽略我的答案。 –

回答

9

我認爲你可以使用values,將其轉換列Value數組:

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 

或者你可以使用:

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 

謝謝@ajcr更好地解釋爲什麼你NaN

當你給一個SeriesDataFramepd.Series,它將使用index指定重新索引它。由於你的DataFrame列有一個整數index(而不是date index),你會得到很多缺失的值。

+0

所以我可以!隊友的歡呼聲! – nlsdfnbch

+0

出於好奇,從什麼將數據轉換爲列表?我一直認爲我可以將'df ['Date']'的返回值視爲可迭代的,與列表相比 - 是不是這種情況? – nlsdfnbch

+2

@ j4ck:當您將一個Series或DataFrame列賦予'pd.Series'時,它會*使用您指定的索引重新索引*。由於你的DataFrame列有一個整數索引(不是日期索引)。你會得到很多缺失的值。 –

0

如果你只是在尋找一個與你可能也做這些值創建系列:

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

你可以這樣做:

s = df.set_index('Date') 

現在是一列數據幀。

如果你真的想把它當作一個系列:

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

順便說一句,楠numpy的不是非數字。

用你的方法,你可以使用:

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

你得到NaN的原因是,你是不是在正確的格式提供數據。你正在將一個系列傳遞給一個系列。