2016-03-05 83 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的原因是,你是不是在正确的格式提供数据。你正在将一个系列传递给一个系列。