我有一个数据帧(650,650),看起来像所描绘的那样。 我需要找到具有相同列名和行名的元素(标签/索引...随便说什么),并使它们等于零。
car0 car1 car2 car3
car0 0 0,25 0,83 2
car1 1,23 0 0,83 0
car2 6,83 0,25 0 5
car3 0,23 0,55 0,43 0
car2 12 2 0 0,5
car2 0,5 2 0 0,5
有人可以帮忙吗?
我一直在遍历列和行,但是没有用。
for c,col in df2.iterrows():
for r,row in df2.iteritems():
if df2.loc[:,c]== df2[r,:]:
df2.loc[row,col] = 0
else: break
答案 0 :(得分:2)
从您的示例看来,列和行具有相同的标签。如果是这样,您可以使用:
for i in df.columns:
df[i][i] = 0
即使标签的排列顺序不同(这样对角线也不应出现零),此方法仍然有效。
如果某些列标签未显示为行标签,反之亦然,那么您需要更详细的解决方案:
for i in df.columns:
try:
df.loc[i].loc[i] = 0
except KeyError:
pass
如果您在行或列上重复了名称,请参考@thesilkworm's answer。您也可以使用unique()
代替set
,但是想法是一样的。
for i in df.index.unique().intersection(df.columns.unique()):
df.loc[i, i] = 0
答案 1 :(得分:1)
问题更新后的更新答案:
首先,获得一组唯一的值,这些值在索引名和列名中均具有特征:
names = set(df.columns).intersection(df.index)
然后使用.loc
设置值来遍历它们:
for name in names:
df.loc[name, name] = 0
这与@Valentino的答案类似,但进行了修改,以确保我们仅将每个名称循环一次。
原始答案假设我们只需要填充对角线即可:
为此,您可以使用np.fill_diagonal
来避免循环:
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.random(size=(5, 5)))
np.fill_diagonal(df.values, 0)
结果:
0 1 2 3 4
0 0.000000 0.707695 0.275748 0.449722 0.321772
1 0.343112 0.000000 0.051894 0.879492 0.210940
2 0.845859 0.016546 0.000000 0.347568 0.233525
3 0.483467 0.094216 0.583731 0.000000 0.242194
4 0.638833 0.382917 0.321501 0.190206 0.000000