Python 按行和列索引查找Dataframe中的确切元素位置
我有一个数据帧(650650),它看起来像所描述的那个。 我需要找到具有相同列和行名称的元素(标签/索引…随你怎么说),并使它们等于零Python 按行和列索引查找Dataframe中的确切元素位置,python,dataframe,Python,Dataframe,我有一个数据帧(650650),它看起来像所描述的那个。 我需要找到具有相同列和行名称的元素(标签/索引…随你怎么说),并使它们等于零 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
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
从您的示例来看,列和行似乎具有相同的标签。如果是,您可以使用:
for i in df.columns:
df[i][i] = 0
即使标签的顺序不相同(例如,零不应出现在对角线上),此操作也有效
如果有列标签不显示为行标签,反之亦然,则需要更详细的解决方案:
for i in df.columns:
try:
df.loc[i].loc[i] = 0
except KeyError:
pass
如果行或列上有重复的名称,请参阅。您也可以使用unique()
istead ofset
,但想法是一样的
for i in df.index.unique().intersection(df.columns.unique()):
df.loc[i, i] = 0
问题更新后的更新答案: 首先,获取一组在索引和列名中都具有的唯一值:
names = set(df.columns).intersection(df.index)
然后使用.loc
对其进行迭代以设置值:
for name in names:
df.loc[name, name] = 0
这与@Valentino的答案类似,但有一个修正,确保我们只在每个名字上循环一次
原始答案假设我们只需填写对角线: 您可以使用此选项来避免循环:
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
谢谢,但没用。错误:试图在数据帧的切片副本上设置值。尝试改用.loc[row\u indexer,col\u indexer]=value。。不管有什么错误,数据帧没有改变以获取更多信息,这是df,df2=pd.dataframe(距离矩阵(df.values,df.values),index=df.index,columns=df.index)在我的解决方案中,数据帧
df
就是您发布的。你打电话给df2的那个。我知道了,谢谢。我编辑了我问题中的数字,所以它更清晰。啊,所以你有重复的名字。这是你以前应该说的。在这种情况下,请使用@thesilkworm的更新解决方案,这是正确的方法。谢谢,但它没有改变我的数据帧:df2=pd.dataframe(距离矩阵(df.values,df.values),index=df.index,columns=df.index)np。填充对角线(df2.values,0)
应该适合您。在上面的示例中,我调用了数据帧df
,而不是df2
。是的,我知道,谢谢。但是我觉得我应该详细说明一下:df已经是对角线了,这意味着我的对角线已经是零了。行基本上是重复的,因此行名称重复了100次,但不是系统地重复。因此,在最后,我将把我的列名与数百行进行比较,直到找到具有相同名称的行并删除单个元素位置(相同的列和相同的行名)。。。。我已经编辑了我的答案,希望它现在能起作用-我最初的填充对角线的想法不适用于你新发布的数据集。它完全按照预期工作!谢谢@thesilkworm!