如何使用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
相关产品推荐
相关产品推荐

