快速检查 dataframe 中某个 [行, 列] 上是否有值

文章探讨了在Python的pandas库中,使用行索引和列索引来判断DataFrame中是否存在特定值的效率差异。通过示例展示了直接对列的值进行判断比对行索引判断更耗时,并提出在考虑效率时,利用行、列索引进行判断是更好的选择。此外,还介绍了多索引检查的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、场景

1)有名字为 df 的 dataframe,行索引是时间,列索引是资产代码。

from pandas import DataFrame
from numpy import random
from datetime import datetime, timedelta

begin_datetime = datetime(2000, 1, 1, 9, 30, 00)
ts_lst = ts_lst = [b + timedelta(minutes=ii) for ii in range(10000)]
df = pd.DataFrame(index=ts_lst, data={'d1': np.random.randint(low=-1000, high=1000, size=10000), 'd2': np.random.randint(low=-1000, high=1000, size=10000)}) / 100

2)想知道某个资产在某个时间上是否有数据。

2、解决方案

In [22]: '2000-01-01 11:30' in df.index
Out[22]: True

In [23]: 4.3 in df.d1.values
Out[23]: True

效率情况:

In [21]: df2 = df.copy()
In [22]: df2 = df2.set_index('d1')

In [24]: %timeit ([ii in df.d1.values for ii in nums])
40.3 ms ± 383 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [27]: %timeit ([ii in df2.index for ii in nums])
5.81 ms ± 60.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

可以看出,直接对一列的值进行判断,比对行索引进行判断要慢得多。
因此,从效率的角度出发,如果想快速判断某个值是否在 dataframe 中,能通过行、列索引来判断更好一些。

补充:对于多索引的检查,语法是

df = pd.DataFrame({'col1': ['a', 'b','c', 'd'], 'col2': ['X','X','Y', 'Y'], 'col3': [1, 2, 3, 4]}, columns=['col1', 'col2', 'col3'])
df = df.set_index(['col1', 'col2'])

'a' in df.index.levels[0] # True
'X' in df.index.levels[1] # True

或者:
('a', 'X') in df.index  # True
('a', 'Y') in df.index  # False
### 如何在 Pandas DataFrame检查某个是否存在 为了确认特定是否存在于整个 DataFrame 或者某一中,可以采用多种方式实现这一目标。 对于在整个 DataFrame 中查找指定存在情况,一种有效的方式是利用 `is_in` 结合 `any()` 函数来完成。这能够快速遍历所有的单元格并返回布尔表示该是否存在[^2]。 当专注于单个时,则可以直接调用上的 `.isin([value])` 方法配合 `.any()` 来检测给定的是否位于此内[^3]。 下面给出具体的代码实例: ```python import pandas as pd # 创建示例数据集 data = {'A': [1, 2, 3], 'B': ['a', 'b', 'c']} df = pd.DataFrame(data) def check_value_exists(df, value): """ 检查整个DataFrame是否有指定存在 参数: df (pd.DataFrame): 被查询数据框 value: 需要查找的目标 返回: bool: 如果找到则返回True;否则False """ return df.eq(value).any().any() print(f"Value exists in whole DataFrame?: {check_value_exists(df, 'b')}") def check_value_in_column(column_name, value): """ 检查特定是否有指定存在 参数: column_name(str): 名 value: 查找的目标 返回: bool: 找到返回True; 否则False """ global df # 使用全局定义的df变量 return df[column_name].eq(value).any() print(f"Value exists in Column A?: {check_value_in_column('A', 2)}") print(f"Value exists in Column B?: {check_value_in_column('B', 'd')}") ``` 上述例子展示了两种不同的场景下如何高效地验证一个具体数是否被包含于 PandasDataFrame 当中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值