遍历 Panda 数据帧以计算和调整单元格

Iterating through a Panda dataframe to count and adjust a cell

我有一个像这样的熊猫数据框:

        colLabelA   colLabelB   ... colLabelZ
rowLabelA   10      0           0
specialRow  0       10          0
rowLabelB   20      0           10
...
rowLabelZ   0       0           20

基本上我只知道名为 specialRow 的行。我需要的是找到一种遍历整个数据框并检查所有列是否为 0(零)的方法。

如果一列除 specialRow 外全为零,则该列的逐行单元格也需要设为零。否则移动到下一列并检查那个。

所以在上面的例子中,只有 colLabelB 除了 specialRow 之外全为零,所以需要像这样更新:

        colLabelA   colLabelB   ... colLabelZ
rowLabelA   10      0           0
specialRow  0       0           0
rowLabelB   20      0           10
...
rowLabelZ   0       0           20

有什么快捷的方法吗?

数据帧不是很大,但我也不希望它太慢。

对于每一列,排除特定索引,然后检查该列的所有其他值是否为零,如果是,则只需将 0 分配给此类列:

for col in df:
    if df[df.index!='specialRow'][col].eq(0).all():
        df[col] = 0 

输出:

            colLabelA  colLabelB  colLabelZ
rowLabelA          10          0          0
specialRow          0          0          0
rowLabelB          20          0         10
rowLabelZ           0          0         20

事实上 df.index!='specialRow' 对所有列都保持不变,因此您可以将它分配给一个变量并用于每个列。

使用 drop 删除命名行,然后使用 eq(0).all() 检查 0。然后你可以更新 loc:

df.loc['specialRow', df.drop('specialRow').eq(0).all()] = 0

这也适用于多个特殊行:

specialRows = ['specialRow']
df.loc[specialRows, df.drop(specialRows).eq(0).all()] = 0

输出:

            colLabelA  colLabelB  colLabelZ
rowLabelA          10          0          0
specialRow          0          0          0
rowLabelB          20          0         10
rowLabelZ           0          0         20

删除包含 'specialRow' 的行,检查列的值是否全部为零。

if (df.drop(['specialRow'])['colLabelB'] == 0).all():
    df['B'] = 0