Python 按行和列索引查找Dataframe中的确切元素位置

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

我有一个数据帧(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     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 of
set
,但想法是一样的

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!