AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 78692950
Accepted
Pro Q
Pro Q
Asked: 2024-07-01 23:02:53 +0800 CST2024-07-01 23:02:53 +0800 CST 2024-07-01 23:02:53 +0800 CST

为什么使用太长的布尔系列索引一系列值时不会引发警告?

  • 772

我有以下代码:

import pandas as pd

series_source = pd.Series([1, 2, 3, 4], dtype=int)
normal_index = pd.Series([True, False, True, True], dtype=bool)
big_index = pd.Series([True, False, True, True, False, True], dtype=bool)

# Both indexes give back: pd.Series([1, 2, 3, 4], dtype=int)
# no warnings are raised!
assert (series_source[normal_index] == series_source[big_index]).all() 

df_source = pd.DataFrame(
    [
        [1, 2, 3, 4],
        [5, 6, 7, 8],
        [9, 10, 11, 12],
        [13, 14, 15, 16]
    ]
)

# no warning - works as expected: grabs rows 0, 2, and 3
df_normal_result = df_source[normal_index]

# UserWarning: Boolean Series key will be reindexed to match DataFrame index.
# (but still runs)
df_big_result = df_source[big_index]

# passes - they are equivalent
assert df_normal_result.equals(df_big_result)
print("Complete")

为什么使用 索引series_source不会big_index引发警告,即使大索引的值比源多? pandas 在后台做了什么来执行 Series 索引?

(与索引相比df_source,会引发明确警告,big_index需要重新索引才能使操作正常工作。)

在索引文档中,它声称:

使用布尔向量来索引 Series 的方式与 NumPy ndarray 完全相同

然而,如果我这样做

import numpy as np

a = np.array([1, 2, 3, 4, 5])
b = np.array([True, False, True, True, False])
c = np.array([True, False, True, True, False, True, True])

# returns an ndarray of [1,3, 4] as expected
print(a[b])

# raises IndexError: boolean index did not match indexed array along axis 0;
# size of axis is 5 but size of corresponding boolean axis is 7
print(a[c])

因此,此功能似乎与 Numpy 不匹配,正如文档所述。发生了什么?

(我的版本是pandas==2.2.2和numpy==2.0.0。)

python
  • 2 2 个回答
  • 40 Views

2 个回答

  • Voted
  1. Best Answer
    mozway
    2024-07-01T23:07:42+08:002024-07-01T23:07:42+08:00

    因为索引Series首先与被索引的DataFrame/Series的索引对齐。

    简而言之,pandas 正在做:

    tmp = big_index.reindex(df.index)
    df_big_result = df_source[tmp]
    

    系列示例:

    pd.Series([0,1,2])[pd.Series([True, True, False], index=[1,2,0])]
    
    #  1    1
    #  2    2
    #  dtype: int64
    

    如果你改变索引系列的索引,你实际上可以自己观察到这一点:

    big_index2 = pd.Series([False, False, True, True, True, True],
                           index=[4,5,0,1,2,3], dtype=bool)
    df_source[big_index2]
    

    输出:

        0   1   2   3
    0   1   2   3   4
    1   5   6   7   8
    2   9  10  11  12
    3  13  14  15  16
    

    尽管前两个值为 ,但输出中仍有 4 行False。重新索引后,布尔值为[True, True, True, True]。

    在这种情况下你应该收到警告:

    UserWarning: Boolean Series key will be reindexed to match DataFrame index.
    

    请注意,如果无法完成对齐,则会引发错误,就像在 numpy 中一样:

    pd.Series([0,1,2])[pd.Series([True, True, False], index=[1,2,3])]
    # IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match).
    
    pd.Series([0,1,2])[[True, False, False, True]]
    # IndexError: Boolean index has wrong length: 4 instead of 3
    

    为什么 DataFrame[Series] 会出现这种情况,而 Series[Series] 不会出现这种情况?

    因为有一个对 DataFrame[Series] 的检查

    # internal for DataFrame.__getitem__
         def __getitem__(self, key):
            # ...
            if isinstance(key, Series) and not key.index.equals(self.index):
                warnings.warn(
                    "Boolean Series key will be reindexed to match DataFrame index.",
                    UserWarning,
                    stacklevel=find_stack_level(),
                )
    
    # internal for Series.__getitem__
             if com.is_bool_indexer(key):
                 key = check_bool_indexer(self.index, key)
                 key = np.asarray(key, dtype=bool)
                 return self._get_rows_with_mask(key)
    
    
    • 2
  2. Pro Q
    2024-07-01T23:52:18+08:002024-07-01T23:52:18+08:00

    澄清我从@mozway 的回答中了解到的情况:

    当使用pd.Series或pd.DataFrame索引pd.Series[bool]时,pandas 会将源系列中的值的标签(或源数据框中的行的标签)与索引系列中的标签进行匹配。此过程通过以下方法在内部完成reindex:bool_series.reindex(source.index)。

    请注意,如果标签位于源中但不在布尔索引器中,则无法重新建立索引,因此程序将引发错误。

    如果源是数据框,并且索引布尔系列的标签与源数据框的标签不完全匹配(source_df.index != bool_series.index),则程序将发出警告,表明将重新编制索引。但是,如果源是系列,并且标签不完全匹配(source_series.index != bool_series.index),则不会发出警告(它只会默默地重新索引布尔系列)。这只是一个实现细节。

    • 0

相关问题

  • 如何将 for 循环拆分为 3 个单独的数据框?

  • 如何检查 Pandas DataFrame 中的所有浮点列是否近似相等或接近

  • “load_dataset”如何工作,因为它没有检测示例文件?

  • 为什么 pandas.eval() 字符串比较返回 False

  • Python tkinter/ ttkboostrap dateentry 在只读状态下不起作用

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行?

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    何时应使用 std::inplace_vector 而不是 std::vector?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Martin Hope
    Aleksandr Dubinsky 为什么 InetAddress 上的 switch 模式匹配会失败,并出现“未涵盖所有可能的输入值”? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge 为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini 具有指定基础类型但没有枚举器的“枚举类”的用途是什么? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer 何时应使用 std::inplace_vector 而不是 std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB 为什么 GCC 生成有条件执行 SIMD 实现的代码? 2024-02-17 06:17:14 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve