如何在Pandas DataFrame列中高效查找子串并解决AttributeError报错
如何在Pandas DataFrame列中高效查找子串并解决AttributeError报错
嗨,我来帮你搞定这个问题~
首先咱们先搞清楚你报错的原因:你把row_data['source_id']转成了Python原生的字符串对象,而contains()是Pandas Series(也就是列)专属的方法,原生字符串根本没有这个属性,所以才会抛出AttributeError: 'str' object has no attribute 'contains'的错误。
而且还要提一句:用iterrows()逐行循环处理大DataFrame效率特别低,完全没必要这么做——Pandas最擅长的就是矢量化操作,咱们换个更高效的方式来解决这个问题。
最优解决方案:用Pandas矢量化操作查找子串
- 先把整个
source_id列转换成字符串类型(因为你的原始数据是int):
my_df['source_id_str'] = my_df['source_id'].astype(str)
- 直接用
str.contains()筛选出包含目标子串的行:
# 获取所有匹配的行 matching_rows = my_df[my_df['source_id_str'].str.contains('136704')]
- 如果需要打印行号和对应的source_id,直接遍历筛选后的结果就行(这时候循环的数据量已经很小了):
for idx, row in matching_rows.iterrows(): print(idx, row['source_id'])
或者更简洁地直接输出:
print(matching_rows[['source_id']])
如果你一定要用原来的循环方式(不推荐)
那只需要把判断条件改成原生字符串的子串判断方式——用in关键字就行:
for row_num, row_data in my_df.iterrows(): source_id = str(row_data['source_id']) # 把contains改成in if '136704' in source_id: print(row_num, source_id)
为什么推荐矢量化操作?
因为Pandas的矢量化操作是基于底层C语言实现的,处理大数据集时,速度比Python逐行循环快几十甚至上百倍,能帮你节省大量的时间~
备注:内容来源于stack exchange,提问作者user123892
相关产品推荐
相关产品推荐

