Python:用if语句替换Dataframe中的单元格值
我有一个矩阵,长得像这样:
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]