在平方矩阵状的数据框架上,熊猫等效于最大值(下三角,上三角)



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

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

我该如何在熊猫中做到这一点?我有一个幼稚的.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

我们首先引入了一个带有the的u的新列(即,转移索引的u值(。然后,我们卸下u小于theftsphed 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

最新更新