Python:用if语句替换Dataframe中的单元格值

1 投票
2 回答
1849 浏览
提问于 2025-04-18 03:50

我有一个矩阵,长得像这样:

    com 0 1 2 3 4 5
AAA  0  5 0 4 2 1 4
ABC  0  9 8 9 1 0 3
ADE  1  4 3 5 1 0 1
BCD  1  6 7 8 3 4 1
BCF  2  3 4 2 1 3 0 ...

其中 AAA, ABC 等是数据框的索引。数据框的列是 com 0 1 3 4 5 6

我想把数据框中某些单元格的值设为0,当某一行的 com 值等于对应的列“数字”时。比如,上面的矩阵会变成这样:

    com 0 1 2 3 4 5
AAA  0  0 0 4 2 1 4
ABC  0  0 8 9 1 0 3
ADE  1  4 0 5 1 0 1
BCD  1  6 0 8 3 4 1
BCF  2  3 4 0 1 3 0 ...

我试着遍历每一行,并使用 .loc.ix,但是没有成功。

2 个回答

0

我觉得这个应该可以工作。

for line in range(len(matrix)):
    matrix[matrix[line][0]+1]=0

注意:根据你的矩阵设置,你可能不需要加1。

基本上,它会取矩阵中每一行的第一个数字,然后用这个数字作为要改成0的值的索引。

也就是说,如果这一行是

    c 0 1 2 3 4 5
AAA 4 3 2 3 9 5 9, 

那么它会把数字4下面的5改成0。

    c 0 1 2 3 4 5
AAA 4 3 2 3 9 0 9
2

只需要一些 numpy 的小技巧

In [22]:

print df
   0  1  2  3  4  5
0  5  0  4  2  1  4
0  9  8  9  1  0  3
1  4  3  5  1  0  1
1  6  7  8  3  4  1
2  3  4  2  1  3  0

[5 rows x 6 columns]
In [23]:
#making a masking matrix, 0 where column and index values equal, 1 elsewhere, kind of the vectorized way of doing if TURE 0, else 1
print df*np.where(df.columns.values==df.index.values[..., np.newaxis], 0,1)
   0  1  2  3  4  5
0  0  0  4  2  1  4
0  0  8  9  1  0  3
1  4  0  5  1  0  1
1  6  0  8  3  4  1
2  3  4  0  1  3  0

[5 rows x 6 columns]

撰写回答