遍历无行列名的10行×10001列Pandas DataFrame,查找小于-1的值
找出DataFrame中小于指定值的元素及其索引
对于列数较多(如10001列)的DataFrame,不推荐使用iterrows()——它逐行遍历的特性会导致效率极低。优先选择Pandas矢量化操作或numpy方法,既高效又简洁。
方法一:用stack() + 布尔索引(最直观)
import pandas as pd import numpy as np # 模拟你的无行列名DataFrame(故意加入一个小于-1的测试值) df = pd.DataFrame(np.random.randn(10, 10001)) df.iloc[5, 9998] = -1.5 # 测试用的小于-1的值 # 转换为带MultiIndex的Series,筛选出目标元素 filtered_elements = df.stack()[df.stack() < -1] # 遍历输出结果 for (row_idx, col_idx), value in filtered_elements.items(): print(f"行索引: {row_idx}, 列索引: {col_idx}, 数值: {value}")
stack()会将DataFrame转换为Series,其索引是(行索引, 列索引)的组合,直接通过布尔索引筛选后即可遍历输出。
方法二:用numpy.where(性能最优)
import pandas as pd import numpy as np # 模拟数据 df = pd.DataFrame(np.random.randn(10, 10001)) df.iloc[7, 5000] = -2.3 # 测试值 # 获取所有满足条件的位置和数值 row_indices, col_indices = np.where(df < -1) target_values = df.values[row_indices, col_indices] # 输出结果 for row, col, val in zip(row_indices, col_indices, target_values): print(f"行索引: {row}, 列索引: {col}, 数值: {val}")
np.where直接返回满足条件的元素的行、列整数索引,再从DataFrame的底层数值数组中提取对应值,这种方法处理大数据量时速度最快。
若坚持使用iterrows()(不推荐)
如果一定要用iterrows()实现,代码如下,但注意10001列的场景下会非常慢:
import pandas as pd import numpy as np # 模拟数据 df = pd.DataFrame(np.random.randn(10, 10001)) df.iloc[3, 8000] = -1.2 # 测试值 for row_idx, row_data in df.iterrows(): # 遍历当前行的每个元素(列索引+数值) for col_idx, value in row_data.items(): if value < -1: print(f"行索引: {row_idx}, 列索引: {col_idx}, 数值: {value}")
内容的提问来源于stack exchange,提问作者Margot Boekema
相关产品推荐
相关产品推荐

