You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用numpy.where比较Pandas DataFrame中的特定数组元素?

我来帮你解决这个问题~你遇到的核心问题是没办法正确提取数组(列表)列里的单个元素,进而完成逐行比较,对吧?

首先得指出你代码里的问题:pdf.loc[pdf['Cidade']:, 2]这种写法是错误的——loc是用来定位DataFrame的行和列的,而Cidade列的每个元素是独立的列表,不能直接用这种方式取列表里的第3个元素。

解决方案步骤

先构造你的示例数据(方便复现和测试):

import pandas as pd
import numpy as np

data = {
    'Id': [1,2,3,4,5],
    'City': [[5057, 'Itu', 26], [5366, 'Sorocaba', 26], [5347, 'São Paulo', 26], [3288, 'Curitiba', 18], [162, 'Manaus', 3]],
    'UF': [[26, 'São Paulo'], None, [26, 'São Paulo'], [18, 'Paraná'], [3, 'Amazonas']]
}
pdf = pd.DataFrame(data)

1. 提取需要比较的元素

我们需要从每一行的City列表中取第3个元素(索引为2),从UF列表中取第1个元素(索引为0),同时处理UF列的None空值:

# 提取City列列表的第3个元素
city_uf_code = pdf['City'].apply(lambda x: x[2] if isinstance(x, list) else np.nan)
# 提取UF列列表的第1个元素,处理None的情况
uf_code = pdf['UF'].apply(lambda x: x[0] if isinstance(x, list) else np.nan)

2. 用np.where完成逐行比较

现在就可以直接比较这两列,得到你想要的布尔结果:

result = np.where(city_uf_code == uf_code, True, False)

如果你想简化成一行代码,也可以这样写:

result = np.where(
    pdf['City'].apply(lambda x: x[2] if isinstance(x, list) else np.nan) == 
    pdf['UF'].apply(lambda x: x[0] if isinstance(x, list) else np.nan),
    True,
    False
)

额外简化技巧

如果你的City列全是列表,UF列只有列表和None,可以用Pandas的str索引来简化提取步骤,效果和上面一致:

city_uf_code = pdf['City'].str[2]
uf_code = pdf['UF'].str[0]
result = np.where(city_uf_code == uf_code, True, False)

运行后result的结果是:array([ True, False, True, True, True]),完全符合你的需求——第2行(索引1)因为UF是None,比较结果为False,其余行匹配成功为True。

内容的提问来源于stack exchange,提问作者Anderson Gabriel Ferreira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:54:58