【问题标题】:Python Pandas: DataFrame modification with diagnal value = 0 [duplicate]Python Pandas:使用诊断值修改 DataFrame = 0 [重复]
【发布时间】:2018-06-20 09:48:05
【问题描述】:

我有一个 Pandas Dataframe 问题。我有一个索引=列的df。它看起来像下面。

df:
       DNA      Cat2                                   
       Item     A   B   C   D   E   F   F   H   I   J  .......
DNA   Item
Cat2  A         812 62  174 0   4   46  46  7   2   15 
      B         62  427 27  0   0   12  61  2   4   11 
      C         174 27  174 0   0   13  22  5   2   4  
      D         0   0   0   0   0   0   0   0   0   0  
      E         4   0   0   0   130 10  57  33  4   5  
      F         46  12  13  0   10  187 4   5   0   0 
      ......

换句话说,df=df.transpose()。我想要做的就是找到 pandas(或 numpy 用于 df.values())函数来删除 index=column 值。我的理想输出如下。

df:
       DNA      Cat2                                   
       Item     A   B   C   D   E   F   F   H   I   J  .......
DNA   Item
Cat2  A         0   62  174 0   4   46  46  7   2   15 
      B         62  0   27  0   0   12  61  2   4   11 
      C         174 27  0   0   0   13  22  5   2   4  
      D         0   0   0   0   0   0   0   0   0   0  
      E         4   0   0   0   0   10  57  33  4   5  
      F         46  12  13  0   10  0   4   5   0   0 
      ......

是否有一个 python 函数可以使这一步非常快?我尝试使用 df.iloc[i,i]=0 进行循环,但由于我的数据集非常大,因此需要很长时间才能完成。提前致谢!

【问题讨论】:

  • 哎呀。我必须删除这个问题吗? @Tai
  • 不这么认为。您也可以在那里尝试答案。其他人会将其标记为他们认为合适的重复。

标签: python pandas numpy dataframe matrix


【解决方案1】:

设置

np.random.seed([3,1415])
i = pd.MultiIndex.from_product(
    [['Cat2'], list('ABCDEFGHIJ')],
    names=['DNA', 'Item']
)

a = np.random.randint(5, size=(10, 10))
df = pd.DataFrame(a + a.T + 1, i, i)

df

DNA       Cat2                           
Item         A  B  C  D  E  F  G  H  I  J
DNA  Item                                
Cat2 A       1  6  6  7  7  7  4  4  8  2
     B       6  1  3  6  1  6  6  4  8  5
     C       6  3  9  8  9  6  7  8  4  9
     D       7  6  8  1  6  9  4  5  4  3
     E       7  1  9  6  9  7  3  7  2  6
     F       7  6  6  9  7  9  3  4  6  6
     G       4  6  7  4  3  3  9  4  5  5
     H       4  4  8  5  7  4  4  5  4  5
     I       8  8  4  4  2  6  5  4  9  7
     J       2  5  9  3  6  6  5  5  7  3

选项 1
最简单的方法是乘以 1 减去身份

df * (1 - np.eye(len(df), dtype=int))

DNA       Cat2                           
Item         A  B  C  D  E  F  G  H  I  J
DNA  Item                                
Cat2 A       0  6  6  7  7  7  4  4  8  2
     B       6  0  3  6  1  6  6  4  8  5
     C       6  3  0  8  9  6  7  8  4  9
     D       7  6  8  0  6  9  4  5  4  3
     E       7  1  9  6  0  7  3  7  2  6
     F       7  6  6  9  7  0  3  4  6  6
     G       4  6  7  4  3  3  0  4  5  5
     H       4  4  8  5  7  4  4  0  4  5
     I       8  8  4  4  2  6  5  4  0  7
     J       2  5  9  3  6  6  5  5  7  0

选项 2
但是,我们也可以将pd.DataFrame.masknp.eye 一起使用。屏蔽很好,因为它不必是数字,它仍然可以工作。

df.mask(np.eye(len(df), dtype=bool), 0)

DNA       Cat2                           
Item         A  B  C  D  E  F  G  H  I  J
DNA  Item                                
Cat2 A       0  6  6  7  7  7  4  4  8  2
     B       6  0  3  6  1  6  6  4  8  5
     C       6  3  0  8  9  6  7  8  4  9
     D       7  6  8  0  6  9  4  5  4  3
     E       7  1  9  6  0  7  3  7  2  6
     F       7  6  6  9  7  0  3  4  6  6
     G       4  6  7  4  3  3  0  4  5  5
     H       4  4  8  5  7  4  4  0  4  5
     I       8  8  4  4  2  6  5  4  0  7
     J       2  5  9  3  6  6  5  5  7  0

选项 3
如果列和索引不相同,OR 会出现故障。我们可以使用相等来告诉我们在哪里屏蔽。

d = df.iloc[::-1]
d.mask(d.index == d.columns.values[:, None], 0)

DNA       Cat2                           
Item         A  B  C  D  E  F  G  H  I  J
DNA  Item                                
Cat2 J       2  5  9  3  6  6  5  5  7  0
     I       8  8  4  4  2  6  5  4  0  7
     H       4  4  8  5  7  4  4  0  4  5
     G       4  6  7  4  3  3  0  4  5  5
     F       7  6  6  9  7  0  3  4  6  6
     E       7  1  9  6  0  7  3  7  2  6
     D       7  6  8  0  6  9  4  5  4  3
     C       6  3  0  8  9  6  7  8  4  9
     B       6  0  3  6  1  6  6  4  8  5
     A       0  6  6  7  7  7  4  4  8  2

【讨论】:

  • 我知道所有的诊断值都乘以零,但是其他值会受到乘法的影响吗?
  • 它们乘以 1
  • 哇。感谢所有的选择。您如何评价速度明智?
  • 不确定。这些都不是为了超级快。但是没有什么能真正减慢他们的速度。我怀疑它们都是相似的。如果您需要更快,请告诉我。如果是这样,我将发布一个量身定制的速度解决方案。
猜你喜欢
  • 1970-01-01
  • 2022-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多