pandas.Series.interpolate()不执行任何操作,为什么?

arknldoa  于 2023-06-20  发布在  其他
关注(0)|答案(5)|浏览(130)

我有一个DatetimeIndex的数据框架。这是其中一列:

>>> y.out_brd
2013-01-01 11:25:00     0.04464286
2013-01-01 11:30:00            NaN
2013-01-01 11:35:00            NaN
2013-01-01 11:40:00    0.005952381
2013-01-01 11:45:00     0.01785714
2013-01-01 11:50:00    0.008928571
Freq: 5T, Name: out_brd, dtype: object

当我尝试在函数上使用interpolate()时,我完全没有任何变化:

>>> y.out_brd.interpolate(method='time')
2013-01-01 11:25:00     0.04464286
2013-01-01 11:30:00            NaN
2013-01-01 11:35:00            NaN
2013-01-01 11:40:00    0.005952381
2013-01-01 11:45:00     0.01785714
2013-01-01 11:50:00    0.008928571
Freq: 5T, Name: out_brd, dtype: object

如何让它工作?
更新:生成这样的 Dataframe 的代码。

time_index = pd.date_range(start=datetime(2013, 1, 1, 3),
                       end=datetime(2013, 1, 2, 2, 59),
                       freq='5T')
grid_columns = [u'in_brd', u'in_alt', u'out_brd', u'out_alt']                           

df = pd.DataFrame(index=time_index, columns=grid_columns)

然后,我用一些数据填充单元格。
我有dataframe field_data,其中包含关于在铁路上上下车的调查数据,以及station变量。我也有一个interval_end函数定义如下:

interval_end = lambda index, prec_lvl: index.to_datetime() \
                        + timedelta(minutes=prec_lvl - 1,
                                    seconds=59)

代码:

for index, row in df.iterrows():
    recs = field_data[(field_data.station_name == station)
                    & (field_data.arrive_time >= index.time())
                    & (field_data.arrive_time <= interval_end(
                                        index, prec_lvl).time())]
    in_recs_num = recs[recs.orientation == u'in'][u'train_number'].count()
    out_recs_num = recs[recs.orientation == u'out'][u'train_number'].count()

    if in_recs_num:
        df.loc[index, u'in_brd'] = recs[
                recs.orientation == u'in'][u'boarding'].sum()    / \
                (in_recs_num * CAR_CAPACITY)
        df.loc[index, u'in_alt'] = recs[
                recs.orientation == u'in'][u'alighting'].sum()   / \
                (in_recs_num * CAR_CAPACITY)
    if out_recs_num:
        df.loc[index, u'out_brd'] = recs[
                recs.orientation == u'out'][u'boarding'].sum()  / \
                (out_recs_num * CAR_CAPACITY)
        df.loc[index, u'out_alt'] = recs[
                recs.orientation == u'out'][u'alighting'].sum() / \
                (out_recs_num * CAR_CAPACITY)
to94eoyn

to94eoyn1#

您需要将Series转换为float64而不是当前的object。这里有一个例子来说明两者的区别。请注意,通常object dtype Series的使用有限,最常见的情况是Series包含字符串。除此之外,它们非常慢,因为它们不能利用任何数据类型信息。

In [9]: s = Series(randn(6), index=pd.date_range('2013-01-01 11:25:00', freq='5T', periods=6), dtype=object)

In [10]: s.iloc[1:3] = nan

In [11]: s
Out[11]:
2013-01-01 11:25:00   -0.69522
2013-01-01 11:30:00        NaN
2013-01-01 11:35:00        NaN
2013-01-01 11:40:00   -0.70308
2013-01-01 11:45:00    -1.5653
2013-01-01 11:50:00    0.95893
Freq: 5T, dtype: object

In [12]: s.interpolate(method='time')
Out[12]:
2013-01-01 11:25:00   -0.69522
2013-01-01 11:30:00        NaN
2013-01-01 11:35:00        NaN
2013-01-01 11:40:00   -0.70308
2013-01-01 11:45:00    -1.5653
2013-01-01 11:50:00    0.95893
Freq: 5T, dtype: object

In [13]: s.astype(float).interpolate(method='time')
Out[13]:
2013-01-01 11:25:00   -0.6952
2013-01-01 11:30:00   -0.6978
2013-01-01 11:35:00   -0.7005
2013-01-01 11:40:00   -0.7031
2013-01-01 11:45:00   -1.5653
2013-01-01 11:50:00    0.9589
Freq: 5T, dtype: float64
kx5bkwkv

kx5bkwkv2#

我迟到了,但这解决了我的问题。你需要将结果赋给某个变量或它本身。

y=y.out_brd.interpolate(method='time')
jhdbpxl9

jhdbpxl93#

您也可以在不更改数据框名称的情况下使用函数“in place”来修复此问题:

y.out_brd.interpolate(method='time', inplace=True)
lokaqttq

lokaqttq4#

菲利普的简短回答,我第一次错过了,回来回答:
你需要一个浮动系列:

s.astype(float).interpolate(method='time')
to94eoyn

to94eoyn5#

遇到了类似的问题,interpolate什么都不做。
问题在于,要插值的值是0,而不是np.nan。您需要确保有np.nan值需要插值。例如:

test_pdf["col"] = test_pdf.col.replace(0, np.nan)

test_pdf["interpolated_col"] = test_pdf.col.interpolate(method='linear', direction="forward")

print(test_pdf)

相关问题