将系列设置为索引
Setting Series as index
我正在使用 python 2.7 获取我的数据框 data
的数字列,并使其成为一个单独的对象(系列),其日期索引是 [=13] 的另一列=].
new_series = pd.Series(data['numerical_column'] , index=data['dates'])
但是,当我这样做时,我在系列中得到了一堆 NaN
值:
dates
1980-01-31 NaN
1980-02-29 NaN
1980-03-31 NaN
1980-04-30 NaN
1980-05-31 NaN
1980-06-30 NaN
...
为什么我的 numerical_data
值就消失了?
我意识到我显然可以通过执行以下操作来实现此目标,尽管我很好奇为什么我最初的方法失败了。
new_series = data.set_index('dates')['numerical_column']
我认为未对齐列 data['numerical_column']
的索引存在问题。
因此需要通过 values
:
将其转换为 numpy array
new_series = pd.Series(data['numerical_column'].values , index=data['dates'])
样本:
import pandas as pd
import datetime
data = pd.DataFrame({
'dates': {0: datetime.date(1980, 1, 31), 1: datetime.date(1980, 2, 29),
2: datetime.date(1980, 3, 31), 3: datetime.date(1980, 4, 30),
4: datetime.date(1980, 5, 31), 5: datetime.date(1980, 6, 30)},
'numerical_column': {0: 1, 1: 4, 2: 5, 3: 3, 4: 1, 5: 0}})
print (data)
dates numerical_column
0 1980-01-31 1
1 1980-02-29 4
2 1980-03-31 5
3 1980-04-30 3
4 1980-05-31 1
5 1980-06-30 0
new_series = pd.Series(data['numerical_column'].values , index=data['dates'])
print (new_series)
dates
1980-01-31 1
1980-02-29 4
1980-03-31 5
1980-04-30 3
1980-05-31 1
1980-06-30 0
dtype: int64
但是 set_index
的方法更好,但是更慢:
#[60000 rows x 2 columns]
data = pd.concat([data]*10000).reset_index(drop=True)
In [65]: %timeit pd.Series(data['numerical_column'].values , index=data['dates'])
1000 loops, best of 3: 308 µs per loop
In [66]: %timeit data.set_index('dates')['numerical_column']
1000 loops, best of 3: 1.28 ms per loop
验证:
如果列的索引具有相同的索引,则效果很好:
s = data.set_index('dates')['numerical_column']
df = s.to_frame()
print (df)
numerical_column
dates
1980-01-31 1
1980-02-29 4
1980-03-31 5
1980-04-30 3
1980-05-31 1
1980-06-30 0
new_series = pd.Series(df['numerical_column'] , index=data['dates'])
print (new_series)
dates
1980-01-31 1
1980-02-29 4
1980-03-31 5
1980-04-30 3
1980-05-31 1
1980-06-30 0
Name: numerical_column, dtype: int64
我正在使用 python 2.7 获取我的数据框 data
的数字列,并使其成为一个单独的对象(系列),其日期索引是 [=13] 的另一列=].
new_series = pd.Series(data['numerical_column'] , index=data['dates'])
但是,当我这样做时,我在系列中得到了一堆 NaN
值:
dates
1980-01-31 NaN
1980-02-29 NaN
1980-03-31 NaN
1980-04-30 NaN
1980-05-31 NaN
1980-06-30 NaN
...
为什么我的 numerical_data
值就消失了?
我意识到我显然可以通过执行以下操作来实现此目标,尽管我很好奇为什么我最初的方法失败了。
new_series = data.set_index('dates')['numerical_column']
我认为未对齐列 data['numerical_column']
的索引存在问题。
因此需要通过 values
:
numpy array
new_series = pd.Series(data['numerical_column'].values , index=data['dates'])
样本:
import pandas as pd
import datetime
data = pd.DataFrame({
'dates': {0: datetime.date(1980, 1, 31), 1: datetime.date(1980, 2, 29),
2: datetime.date(1980, 3, 31), 3: datetime.date(1980, 4, 30),
4: datetime.date(1980, 5, 31), 5: datetime.date(1980, 6, 30)},
'numerical_column': {0: 1, 1: 4, 2: 5, 3: 3, 4: 1, 5: 0}})
print (data)
dates numerical_column
0 1980-01-31 1
1 1980-02-29 4
2 1980-03-31 5
3 1980-04-30 3
4 1980-05-31 1
5 1980-06-30 0
new_series = pd.Series(data['numerical_column'].values , index=data['dates'])
print (new_series)
dates
1980-01-31 1
1980-02-29 4
1980-03-31 5
1980-04-30 3
1980-05-31 1
1980-06-30 0
dtype: int64
但是 set_index
的方法更好,但是更慢:
#[60000 rows x 2 columns]
data = pd.concat([data]*10000).reset_index(drop=True)
In [65]: %timeit pd.Series(data['numerical_column'].values , index=data['dates'])
1000 loops, best of 3: 308 µs per loop
In [66]: %timeit data.set_index('dates')['numerical_column']
1000 loops, best of 3: 1.28 ms per loop
验证:
如果列的索引具有相同的索引,则效果很好:
s = data.set_index('dates')['numerical_column']
df = s.to_frame()
print (df)
numerical_column
dates
1980-01-31 1
1980-02-29 4
1980-03-31 5
1980-04-30 3
1980-05-31 1
1980-06-30 0
new_series = pd.Series(df['numerical_column'] , index=data['dates'])
print (new_series)
dates
1980-01-31 1
1980-02-29 4
1980-03-31 5
1980-04-30 3
1980-05-31 1
1980-06-30 0
Name: numerical_column, dtype: int64