类似于方形矩阵的dataFrame

时间:2019-07-31 08:16:35

标签: python pandas numpy matrix

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

  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

1 个答案:

答案 0 :(得分: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