当前位置: 首页 > 知识库问答 >
问题:

使用复合索引获取数据帧的行号

嵇出野
2023-03-14

我有一个目录,其中.csv文件包含60分钟的股票数据条,还有一个Python脚本,用于将它们全部加载到熊猫数据框中,并在符号和日期时间上建立索引,如下所示;

import pandas as pd
import glob
import numpy as np

allFiles = glob.glob("D:\\Data\\60 Min Bar Stocks\\*.csv")
frame = pd.DataFrame()
list_ = []
for file_ in allFiles:
    df = pd.read_csv(file_,index_col=None, header=0)
    list_.append(df)
frame = pd.concat(list_)

frame.set_index(['Symbol','Date'],inplace=True)

print(frame.loc["AAL", :])
print(frame.loc["AAL", :].loc["05-Jun-2017 09:00", :])

第一次打印返回以下内容;

                   Open   High    Low   Close   Volume
Date                                                  
05-Jun-2017 09:00  49.53  49.88  49.40  49.64   560155

05-Jun-2017 10:00  49.58  49.89  49.58  49.85   575165

第二次打印返回以下内容:;

Open          49.53
High          49.88
Low           49.40
Close         49.64
Volume    560155.00
Name: 05-Jun-2017 09:00, dtype: float64

如何在数据帧中找到这一行的行索引,然后获得一个切片,该切片是由前一行、当前行和下一个10行组成的12行?

共有1个答案

陈铭晨
2023-03-14

我想您需要get_loc获取multi index的位置,然后选择byiloc

d = '05-Jun-2017 09:00'
s = 'AAL'

pos = df.index.get_loc((s,d))
df1 = df.iloc[pos-1:pos + 11]
print (df1)

但是,如果t是第一个值或10中的某些值是最后一个值,则会出现问题:

df1 = df.iloc[max(pos-1,0): min(pos+11,len(df.index))]

样本:

print (df)
                            Open    High     Low   Close  Volume
Symbol Date                                                     
AAL    05-Jun-2017 08:00  1.1801  1.1819  1.1801  1.1817       4
       05-Jun-2017 09:00  1.1817  1.1818  1.1804  1.1814      18
       05-Jun-2017 10:00  1.1817  1.1817  1.1802  1.1806      12
       05-Jun-2017 11:00  1.1807  1.1815  1.1795  1.1808      26
       05-Jun-2017 12:00  1.1803  1.1806  1.1790  1.1806       4
       05-Jun-2017 13:00  1.1801  1.1801  1.1779  1.1786      23
       05-Jun-2017 14:00  1.1795  1.1801  1.1776  1.1788      28
       05-Jun-2017 15:00  1.1793  1.1795  1.1782  1.1789      10
       05-Jun-2017 16:00  1.1780  1.1792  1.1776  1.1792      12
       05-Jun-2017 17:00  1.1788  1.1792  1.1788  1.1791       4
d = '05-Jun-2017 09:00'
s = 'AAL'

pos = df.index.get_loc((s,d))
df1 = df.iloc[max(pos-1,0): min(pos+10,len(df.index))]
print (df1)
                            Open    High     Low   Close  Volume
Symbol Date                                                     
AAL    05-Jun-2017 08:00  1.1801  1.1819  1.1801  1.1817       4
       05-Jun-2017 09:00  1.1817  1.1818  1.1804  1.1814      18
       05-Jun-2017 10:00  1.1817  1.1817  1.1802  1.1806      12
       05-Jun-2017 11:00  1.1807  1.1815  1.1795  1.1808      26
       05-Jun-2017 12:00  1.1803  1.1806  1.1790  1.1806       4
       05-Jun-2017 13:00  1.1801  1.1801  1.1779  1.1786      23
       05-Jun-2017 14:00  1.1795  1.1801  1.1776  1.1788      28
       05-Jun-2017 15:00  1.1793  1.1795  1.1782  1.1789      10
       05-Jun-2017 16:00  1.1780  1.1792  1.1776  1.1792      12
       05-Jun-2017 17:00  1.1788  1.1792  1.1788  1.1791       4

不可能选择previousrow,因为如果索引为:

d = '05-Jun-2017 08:00'
s = 'AAL'

pos = df.index.get_loc((s,d))
df1 = df.iloc[max(pos-1,0): min(pos+10,len(df.index))]
print (df1)
                            Open    High     Low   Close  Volume
Symbol Date                                                     
AAL    05-Jun-2017 08:00  1.1801  1.1819  1.1801  1.1817       4
       05-Jun-2017 09:00  1.1817  1.1818  1.1804  1.1814      18
       05-Jun-2017 10:00  1.1817  1.1817  1.1802  1.1806      12
       05-Jun-2017 11:00  1.1807  1.1815  1.1795  1.1808      26
       05-Jun-2017 12:00  1.1803  1.1806  1.1790  1.1806       4
       05-Jun-2017 13:00  1.1801  1.1801  1.1779  1.1786      23
       05-Jun-2017 14:00  1.1795  1.1801  1.1776  1.1788      28
       05-Jun-2017 15:00  1.1793  1.1795  1.1782  1.1789      10
       05-Jun-2017 16:00  1.1780  1.1792  1.1776  1.1792      12
       05-Jun-2017 17:00  1.1788  1.1792  1.1788  1.1791       4

不可能选择所有10下一行,因为t是从后面的3.rd值:

d = '05-Jun-2017 15:00'
s = 'AAL'

pos = df.index.get_loc((s,d))
df1 = df.iloc[max(pos-1,0): min(pos+10,len(df.index))]
print (df1)
                            Open    High     Low   Close  Volume
Symbol Date                                                     
AAL    05-Jun-2017 14:00  1.1795  1.1801  1.1776  1.1788      28
       05-Jun-2017 15:00  1.1793  1.1795  1.1782  1.1789      10
       05-Jun-2017 16:00  1.1780  1.1792  1.1776  1.1792      12
       05-Jun-2017 17:00  1.1788  1.1792  1.1788  1.1791       4
 类似资料:
  • 我有两个形状相同的python数据帧,例如: 我想使用df2中的值作为行索引来选择df1中的值,并创建一个形状相等的新数据帧。预期结果: 我已尝试使用.loc,它在单个列中运行良好: 但是我不能同时在所有列上使用. loc或. iloc。我想避免循环来优化性能,因为我正在处理一个大数据帧。有什么想法吗?

  • 问题内容: 例如,假设一个简单的数据框 给定条件,如何检索行的索引值?例如: return ,但是我想得到的只是just 。这在以后的代码中给我带来麻烦。 基于某些条件,我想记录满足该条件的索引,然后在它们之间选择行。 我试过了 获得所需的输出 但我明白了 问题答案: 添加起来更容易-使用一个元素选择list的第一个值: 但是,如果某些值不匹配,则会出现错误,因为第一个值不存在。 解决方案是使用与

  • 本文向大家介绍如何基于R数据帧列的值获取行索引?,包括了如何基于R数据帧列的值获取行索引?的使用技巧和注意事项,需要的朋友参考一下 R数据帧的一行可以在列中具有多种方式,并且这些值可以是数字,逻辑,字符串等。基于行号查找值很容易,但是基于值查找行号却很不同。如果要在特定列中查找特定值的行号,则可以提取整行,这似乎是一种更好的方法,可以使用单个方括号来获取行的子集。 示例 请看以下数据帧- 输出结果

  • 我有一个数据框架,看起来像这样: 我想对数据帧进行切片,以便结果包含所有以<code>foo 获得此结果的一种方法是 但这感觉像是一个非常繁琐的方法,必须有一个更“pythonic”的方法..

  • 获取相应列内容满足条件的索引范围的最有效方法是什么。。类似于以标记开始并以“body”标记结束的行。 例如,数据框如下所示 我要得到行索引1-3 有人能提出最具蟒蛇风格的方法来实现这一点吗?

  • 我得到了一个具有多个列和行的数据帧df1。简单的例子: 我想创建一个空的数据框df2,然后再添加新的列和计算结果。 此时,我的代码如下所示: …添加两个新列: 有没有更好/更安全/更快的方法?是否可以创建一个空数据帧df2,并且只从df1复制索引?