【问题标题】:Pandas equivalent of max(lower triangle, upper triangle) on square matrix-like dataFramePandas 相当于方阵数据帧上的 max(lower triangle, upper triangle)
【发布时间】:2019-12-08 16:53:27
【问题描述】:

我有一个带有双索引(ij)的 DataFrame df,我将其视为(方形和稀疏)矩阵。 在某些时候,我需要执行以下操作:

  1. 比较单元格元素df(i,j) 与其转置df(j,i)
  2. 查找列u 更大的列
  3. 从矩阵中删除较小的一个

如何在熊猫中做到这一点? 我有一个幼稚的.iterrows() 解决方案,它在矩阵尺寸超过数百个时卡住了:

for _,s in df.iterrows():
    if (s.j,s.i) in df.index:
        if df.loc[s.j,s.i]['u']>s['u']:
            df = sg.drop(i,axis=0)

这是df 中的数据(我不知道如何将数据从 jupyter 粘贴到 SO,但让我们试试这个):

i   j   origin_i    destination_i   ttrav_i treq_i  origin_j    destination_j   ttrav_j treq_j  i   j   u   u_i u_j t   t_oo_i_j    delay   t_od_j_i    t_dd_i_j                                                                
281 230 4.627953e+07    46378182.0  455.0   502.0   3.514366e+08    27471867.0  341.0   719.0   281 230 41.7    21.45   20.25   619 234 17.0    292 93
52  456 3.841813e+09    46374243.0  975.0   2586.0  4.962112e+09    46342032.0  808.0   2739.0  52  456 200.4   186.90  13.50   1148    183 30.0    774 191
163 456 4.652382e+07    46378182.0  1133.0  2178.0  4.962112e+09    46342032.0  808.0   2739.0  163 456 61.3    45.15   16.15   1545    558 -3.0    799 188
435 347 4.653102e+07    297095278.0 994.0   1333.0  4.648040e+07    46342898.0  894.0   1708.0  435 347 78.5    28.85   49.65   1289    302 -73.0   836 151
323 383 2.104392e+09    46375508.0  734.0   3070.0  4.641315e+07    46345887.0  603.0   3391.0  323 383 183.5   98.05   85.45   969 338 17.0    441 190

【问题讨论】:

  • 您能提供一些示例输入和预期输出吗? sg 是什么?

标签: python pandas numpy matrix


【解决方案1】:

我们首先引入一个带有转置 u 的新列(即转置索引的 u 值)。然后我们删除所有 u 小于转置后的 u 的行。

例子:

import pandas as pd

df = pd.DataFrame( { 'i': [1, 2, 3, 4, 5],
                     'j': [2, 3, 2, 5, 4],
                     'u': [10, 20, 30, 50, 40]})
df = df.set_index(['i','j'])

print(df)

df['u_transposed'] = df.reindex(index=df.swaplevel().index)['u'].values
df = df[~(df.u<df.u_transposed)].drop(columns='u_transposed')

print(df)

输出:

# original matrix
      u
i j    
1 2  10
2 3  20
3 2  30
4 5  50
5 4  40

# result
      u
i j    
1 2  10
3 2  30
4 5  50

【讨论】:

  • @Intelligent-Infrastructure 我希望我做对了,如果不是,请评论我的示例数据的预期输出。如果您提供 minimal reproducible example 以及预期的输出,这对所有人来说都会变得更容易。
  • 是的,我认为没关系。让我检查一下这是否产生了预期的结果以及它的扩展性(例如,对于 10k x 10k 矩阵)
  • 酷,就像魅力一样。 %timeit 用于 3000 x 3000 矩阵:67.9 ms ± 1.26 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
猜你喜欢
  • 2013-11-06
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 2022-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多