通过行和列索引在数据框中找到确切的元素位置

时间:2019-07-09 11:01:41

标签: python dataframe

我有一个数据帧(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

2 个答案:

答案 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