我有一个具有双索引(df
和i
)的DataFrame j
,我将其视为(平方和稀疏)矩阵。
在某些时候,我需要执行以下操作:
df(i,j)
及其转置df(j,i)
u
列较大的那个如何在熊猫中做到这一点?
我有一个幼稚的.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
答案 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