我是python和pandas的新手。
我正在尝试编写一些代码,其中我将按日期时间索引的熊猫数据帧的倒数第二行与该数据帧的最后一行进行了比较。但是,我在尝试使索引正确比较方面遇到困难。
例如,对于一个数据框
dti = pd.date_range('2018-01-01', periods=10, freq='D')
df = pd.DataFrame(np.random.randn(10, 4), index=dti, columns=['value', 'value1', 'value2', 'value3'])
产生一个数据框
value value1 value2 value3
2018-01-01 0.249018 -0.630937 1.120733 0.343331
2018-01-02 -0.347979 0.218776 -0.327967 0.569075
2018-01-03 0.879929 0.316554 0.159652 -0.872002
2018-01-04 -1.492683 -0.560168 -0.871728 1.739402
2018-01-05 -3.187776 -1.399635 0.873503 -0.098537
2018-01-06 -0.482267 -0.174304 0.821850 1.530861
2018-01-07 0.385600 -0.395019 -0.507524 -0.033996
2018-01-08 1.358576 -2.107309 0.956507 -0.360288
2018-01-09 -0.283369 0.630684 1.148554 -1.907604
2018-01-10 0.896697 0.030671 0.131533 -1.325552
我正在尝试
if df.loc[last_row, ['value']] > df.loc[second_last_row, ['value']]:
# Compare to see if 'value' in 2018-01-10 is higher than 'value' in 2018-01-09
我尝试使用
length = len(df)
if if df.loc[length-1, ['value']] > df.loc[length-2, ['value']]:
但是我得到一个错误
TypeError: cannot do index indexing on <class 'pandas.tseries.index.DatetimeIndex'> with these indexers [5] of <class 'int'>
似乎DatetimeIndex不能像常规整数索引一样操作。
我也考虑过使用
df['value'].tail(1)
但是我不确定如何使用.tail方法访问倒数第二行。
我需要有关如何从数据框尾部到数据框尾部的距离检索数据的建议。谢谢!
答案 0 :(得分:1)
使用:
np.random.seed(2020)
dti = pd.date_range('2018-01-01', periods=10, freq='D')
df = pd.DataFrame(np.random.randn(10, 4), index=dti,
columns=['value','value1','value2','value3'])
print (df)
value value1 value2 value3
2018-01-01 -1.768846 0.075552 -1.130630 -0.651430
2018-01-02 -0.893116 -1.274101 -0.061154 0.064514
2018-01-03 0.410113 -0.572882 -0.801334 1.312035
2018-01-04 1.274699 -1.214358 0.313719 -1.444821
2018-01-05 -0.368961 -0.769227 0.392616 0.057294
2018-01-06 2.089979 0.041971 -0.048341 -0.513154
2018-01-07 -0.084589 -1.215450 -1.412931 -1.486911
2018-01-08 0.382225 0.937673 1.772678 0.878828
2018-01-09 0.331719 -0.306036 1.240266 -0.215627
2018-01-10 0.155929 0.098056 0.832096 2.045205
如果可能要选择列的最后一个值,可以使用DatetimeIndex
的索引,例如:
print (df.loc[df.index[-1], 'value'])
0.15592948059188771
print (df.loc[df.index[-2], 'value'])
0.3317191223642817
df.loc[df.index[-1], 'value'] > df.loc[df.index[-2], 'value']
应该通过DataFrame.iloc
按位置选择来更改您的代码,Index.get_loc
只能将列value
的必要通过位置更改:
length = len(df)
pos = df.columns.get_loc('value')
print (df.iloc[length-1, pos])
0.15592948059188771
print (df.iloc[length-2, pos])
0.3317191223642817
df.iloc[length-1, pos] > df.iloc[length-2, pos]