web-dev-qa-db-ja.com

DataFrame列を使用して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クラスの有効な入力ではありませんか?

_to_series_オブジェクトの_pd.Index_関数 が見つかりました。DataFramesにも同様のものはありますか?

7
nlsdfnbch

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が得られるかを詳しく説明します:

SeriesまたはDataFrame列をpd.Seriesに渡すと、指定したindexを使用してインデックスが再作成されます。 DataFrame列には整数indexdate indexではない)があるため、多くの欠損値が得られます。

21
jezrael

これらの値でシリーズを作成するだけを探している場合は、次のこともできます。

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

あなたはただ行うことができます:

s = df.set_index('Date')

これは現在、1列のデータフレームです。

シリーズとして本当に欲しい場合:

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

ところで、NaNはnumpyの非数です。

あなたの方法を使用して、あなたは使うことができます:

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

NaNを取得する理由は、正しい形式でデータを提供していないためです。シリーズをシリーズに渡します。

0
Alexander