pandas.Series() 使用 DataFrame Columns 创建返回 NaN 数据条目

Posted

技术标签:

【中文标题】pandas.Series() 使用 DataFrame Columns 创建返回 NaN 数据条目【英文标题】:pandas.Series() Creation using DataFrame Columns returns NaN Data entries 【发布时间】:2016-06-19 12:51:00 【问题描述】:

我正在尝试使用代码将数据帧转换为系列,简化后如下所示:

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 对象,DataFrames 是否有类似的东西?

【问题讨论】:

你是从数据框开始还是只是一个中间步骤? 从一个数据框开始——这就是为什么我没有马上把它放在一个系列中;数据是从具有多列的 CSV 加载的。 【参考方案1】:

我认为你可以使用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

当您将SeriesDataFrame 列提供给pd.Series 时,它将使用您指定的index 对其进行重新索引。由于您的DataFrame 列有一个整数index(不是date index),您会得到很多缺失值。

【讨论】:

所以我可以!干杯,伙计! 出于好奇,它将数据从什么转换为列表?我一直认为我可以将 df['Date'] 的返回值视为可迭代的,可与列表相媲美 - 不是这样吗? @j4ck:当你给pd.Series一个Series或DataFrame列时,它会使用你指定的索引reindex它。由于您的 DataFrame 列有一个整数索引(不是日期索引)。你会得到很多缺失值。 @ajcr - 谢谢你的解释。【参考方案2】:

你可以这样做:

s = df.set_index('Date')

现在是单列数据框。

如果你真的想要它作为一个系列:

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

顺便说一句,NaN 是 numpy 的 Not-a-Number。

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

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

您获得 NaN 的原因是您没有以正确的格式提供数据。您正在将一个系列传递给一个系列。

【讨论】:

【参考方案3】:

如果您只是在寻找具有这些值的创建系列,您也可以这样做:

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

【讨论】:

以上是关于pandas.Series() 使用 DataFrame Columns 创建返回 NaN 数据条目的主要内容,如果未能解决你的问题,请参考以下文章

002.Pandas.Series

pandas.Series() 使用 DataFrame Columns 创建返回 NaN 数据条目

pandas数组(pandas Series)-apply方法自定义函数

Pandas Series.apply() 和 Series.map() 有啥区别? [复制]

当使用另一个字符串打印时,打印 Pandas Series 垂直对齐

pandas数组(pandas Series)-