在对项目进行条件迭代Pandas DataFrame时避免嵌套循环

时间:2019-07-31 23:34:40

标签: python pandas loops dataframe nested

下面的代码遍历Pandas DataFrame的每个成员,询问该项的绝对值是否> = 0.5,如果是,则将其值与相应的列名和行名一起附加到列表中:

record = []
for i in range(df.shape[0]):
    for j in range(df.shape[1]):
        if abs(df.iloc[i, j]) >= 0.5:
            record.append([df.columns[j], df.index[i], df.iloc[i, j]])

当然,这可能需要一些时间,具体取决于数据帧的大小,因为执行这些嵌套循环的效率很低...

是否有更好,更快,更Python化的方法来做到这一点?

样本输入:

      colA  colB  colC  colD
row1  -0.7   0.3   0.6  -0.2
row2   0.4  -0.3   0.8  -0.9

示例输出:

[['colA', 'row1', -0.7],
 ['colC', 'row1', 0.6],
 ['colC', 'row2', 0.8],
 ['colD', 'row2', -0.9]]

2 个答案:

答案 0 :(得分:0)

这是mask整个df值然后是stack的一种方法

df.where(df.abs()>0.5).stack().reset_index().values.tolist()

答案 1 :(得分:-1)

使用numpy。使用以下命令将pandas数据框的值转换为numpy:

_DeviceAttributes(/job:localhost/replica:0/task:0/device:CPU:0, CPU, 268435456, 10588614393916958794)
_DeviceAttributes(/job:localhost/replica:0/task:0/device:XLA_GPU:0, XLA_GPU, 17179869184, 12320120782636586575)
_DeviceAttributes(/job:localhost/replica:0/task:0/device:XLA_CPU:0, XLA_CPU, 17179869184, 13378821206986992411)
_DeviceAttributes(/job:localhost/replica:0/task:0/device:GPU:0, GPU, 32039954023, 12481654498215526877)
1.14.0

对于有数据,我首先随机生成它们,然后选择大于0.5的数据:

<ResourceDictionary Source="ImageList16x16.xaml"  />