【问题标题】:Pandas - Selecting multiple rows at given distancesPandas - 在给定距离处选择多行
【发布时间】:2020-01-22 15:26:34
【问题描述】:

所以我有一个看起来像这样的熊猫数据框:

2016-01-28 00:00:00   int   int   int   int   int
2016-01-28 01:00:00   int   int   int   int   int
2016-01-28 02:00:00   int   int   int   int   int

第一列是我的索引列。它有超过 500 行仅供参考。所以,我需要得到:

  • 索引为2016-04-04 00:00:00的行
  • 该行之前的行
  • 该行之前的第二行,
  • 具有该索引的行前的第 24 行

我怎样才能做到这一点?

【问题讨论】:

  • 你发布一些示例代码怎么样?到目前为止,您尝试了什么?
  • 您尝试过使用.loc 吗?
  • 我尝试了 loc 函数(在 jupyter 中工作),但不知道如何实现它。我做了 my_dataframe.loc['2016-04-04 00:00:00'],但之后不知道该怎么做。

标签: python pandas jupyter


【解决方案1】:

为了解决这个问题,我先生成一个测试数据集:

import numpy as np

# Generating a fake dataset
date_index = pd.date_range('2016-01-28' ,'2018-01-28', freq='h')
random_data = np.random.rand(date_index.shape[0], 5)
df = pd.DataFrame(random_data, date_index, columns=['A','B','C','D','E'])

print(df.head(4).to_string())
#                            A         B         C         D         E
#2016-01-28 00:00:00  0.904552  0.962807  0.349137  0.490480  0.706348
#2016-01-28 01:00:00  0.150306  0.027296  0.810233  0.318828  0.756861
#2016-01-28 02:00:00  0.024970  0.138997  0.403566  0.759649  0.619711
#2016-01-28 03:00:00  0.048545  0.581297  0.395148  0.398693  0.013036

有了这个,我们可以直接用loc访问值:

# Accessing 2016-04-04 00:00:00
df.loc['2016-04-04 00:00:00']
#A    0.202226
#B    0.921532
#C    0.530494
#D    0.177240
#E    0.324215

有多种方法可以获取请求的行。其中之一是:

# Accessing positional index of 2016-04-04 00:00:00
d_current = df.index.get_loc('2016-04-04 00:00:00') # = 1608

# Accessing all the requested rows using `iloc`
d_prev = d_current - 1
d_prev_2 = d_current - 21
d_24h_before = d_current - 24 

df.iloc[d_current]
#A    0.202226
#B    0.921532
#C    0.530494
#D    0.177240
#E    0.324215

df.iloc[d_24h_before]
#A    0.458015
#B    0.572196
#C    0.416302
#D    0.445843
#E    0.130110

【讨论】:

    【解决方案2】:

    您可以使用pd.Timedelta 很好地做到这一点,您可以像这样使用它:

    selected_date = pd.Timestamp(2016, 4, 4)
    one_hour_back = pd.Timedelta(hours=1)
    index_one_hour_back = selected_date - one_hour_back
    
    row_one_hour_back = df.loc[index_one_hour_back, :]
    

    但这意味着您必须计算出您所追求的 selected_date 并且能够像这样创建它,或者已经将它作为日期时间对象或 pandas 时间戳。

    【讨论】:

      猜你喜欢
      • 2013-11-28
      • 2021-05-12
      • 2014-08-30
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多