遍历 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
我有一个像这样的熊猫数据框:
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