【问题标题】:Removing matching index values from dataframe从数据框中删除匹配的索引值
【发布时间】:2017-10-26 07:39:17
【问题描述】:

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) == ???

但不知道从哪里继续,也不知道这是否是正确的方法

【问题讨论】:

    标签: python python-2.7 pandas for-loop


    【解决方案1】:

    可以设置对角线:

    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
    

    【讨论】:

    • 谢谢。为什么* 2? :)
    • @LearningToPython * 2 是因为你真正想要的是df.iloc[[np.arange(3), np.arange(3)]],这样可以节省一点打字!
    • 好的,谢谢!我是新手,[np.arange(3), np.arange(3)] 如何工作? ;/对不起
    • @LearningToPython 它是精美的索引,pandas/numpy 中的一大优点请参阅pandas.pydata.org/pandas-docs/stable/indexing.html
    • 看起来很复杂 ;-) 我会试着理解的。再次感谢!
    【解决方案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
    

    【讨论】:

    • 我很惊讶这个df.loc[[(df.index & df.columns)] * 2] 或变体不起作用:/
    【解决方案3】:

    n 是行数/列数

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

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

    https://stackoverflow.com/a/24475214/

    【讨论】:

    • 哦,太好了。为什么* 2
    • 我指的是 [np.arange(n)]*2] ;-) 顺便说一句
    • 注意:fill_diagonal 并不总是有效,因为有时 df.values 将是一个副本。事实上,在你的两个例子中都是如此。例如。混合数据类型会发生这种情况。
    • 例如,在尝试之前先做df.iloc[0, 2] = 'a'
    猜你喜欢
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 2013-11-19
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多