从数据框中删除匹配的索引值

时间:2017-10-25 22:22:01

标签: python python-2.7 pandas for-loop

df

         0         1         2 
0 0.0481948 0.1054251 0.1153076 
1 0.0407258 0.0890868 0.0974378 
2 0.0172071 0.0376403 0.0411687
etc.

我想删除数据框的x和y标题/值相等的所有值,因此,我的预期输出将是这样的:

         0         1         2 
0 NaN       0.1054251 0.1153076 
1 0.0407258 NaN       0.0974378 
2 0.0172071 0.0376403 NaN
etc.

如图所示,已删除/替换(0,0),(1,1),(2,2)等的值。

我想到了如下循环索引:

for (idx, row) in df.iterrows():
    if (row.index) == ???

但不知道在哪里进行或者是否是正确的方法

3 个答案:

答案 0 :(得分:4)

您可以设置对角线:

In [11]: df.iloc[[np.arange(len(df))] * 2] = np.nan

In [12]: df
Out[12]:
          0         1         2
0       NaN  0.105425  0.115308
1  0.040726       NaN  0.097438
2  0.017207  0.037640       NaN

答案 1 :(得分:2)

@ AndyHayden的回答非常酷,并教会了我一些东西。但是,它取决于iloc,并且数组是方形的,并且所有内容都是相同的顺序。

我概括了这里的概念

考虑数据框df

df = pd.DataFrame(1, list('abcd'), list('xcya'))

df

   x  c  y  a
a  1  1  1  1
b  1  1  1  1
c  1  1  1  1
d  1  1  1  1

然后我们使用numpy广播和np.where执行相同的花哨索引分配:

ij = np.where(df.index.values[:, None] == df.columns.values)

df.iloc[list(map(list, ij))] = 0

df

   x  c  y  a
a  1  1  1  0
b  1  1  1  1
c  1  0  1  1
d  1  1  1  1

答案 2 :(得分:0)

n是行数/列数

df.values[[np.arange(n)]*2] = np.nan

np.fill_diagonal(df.values, np.nan)

请参阅https://stackoverflow.com/a/24475214/