【问题标题】:Setting Series as index将系列设置为索引
【发布时间】:2017-02-23 01:17:50
【问题描述】:

我正在使用 python 2.7 获取我的数据框 data 的数字列,并将其作为一个单独的对象(系列),其日期索引是来自 data 的另一列。

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']

【问题讨论】:

  • jezrael 给出了如何解决问题的完美答案。但只是为了确保您了解尝试失败的原因...如果您将 pandas 对象作为数据参数以及索引参数传递,pandas 会尝试使用索引参数重新索引数据参数。 pd.Series(data['numerical_column'], data['dates']) 等价于data['numerical_column'].reindex(data['dates']) 当这样说时,你的价值观为什么消失就更明显了。 data['numerical_column'] 没有在 data['dates'] 中指定的索引值。

标签: python python-2.7 pandas dataframe series


【解决方案1】:

我认为列data['numerical_column']的索引不对齐存在问题。

所以需要将其转换为numpy array by values:

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

【讨论】:

  • 谢天谢地,我遇到了这个答案:我花了几个小时试图弄清楚。荒谬的是,必须手动.values; Python,你为什么先给然后从我们这里拿走? :p
猜你喜欢
  • 2021-09-09
  • 2019-04-14
  • 2021-07-05
  • 1970-01-01
  • 2016-10-03
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多