将一行中的每个值与 pandas 数据框中的其他行配对
Pair each value in a row with other rows in pandas dataframe
我有一个 500 行的数据框,排序如下:
Col1 Val1
asd 0.27
pqer 0.37
psdf 0.54
我正在尝试将 Col1
的每个值与 Col1
中具有更高 Val1
的另一行配对以获得以下列表:
[['asd', 'pqer'], ['asd','psdf'],['pqer','psdf']]
我不知道该怎么做。
尝试自我合并和过滤:
df.merge(df, how='cross')\
.query('Val1_x < Val1_y')[['Col1_x','Col1_y']]\
.to_numpy().tolist()
输出:
[['asd', 'pqer'], ['asd', 'psdf'], ['pqer', 'psdf']]
二分搜索可能比笛卡尔连接更有效(取决于数据大小); conditional_join from pyjanitor 可以提供帮助:
# pip install pyjanitor
import pandas as pd
import janitor
(df.conditional_join(df, ('Val1', 'Val1', '<'))
.loc(axis=1)[:, 'Col1']
.to_numpy()
.tolist()
)
[['asd', 'pqer'], ['asd', 'psdf'], ['pqer', 'psdf']]
我有一个 500 行的数据框,排序如下:
Col1 Val1
asd 0.27
pqer 0.37
psdf 0.54
我正在尝试将 Col1
的每个值与 Col1
中具有更高 Val1
的另一行配对以获得以下列表:
[['asd', 'pqer'], ['asd','psdf'],['pqer','psdf']]
我不知道该怎么做。
尝试自我合并和过滤:
df.merge(df, how='cross')\
.query('Val1_x < Val1_y')[['Col1_x','Col1_y']]\
.to_numpy().tolist()
输出:
[['asd', 'pqer'], ['asd', 'psdf'], ['pqer', 'psdf']]
二分搜索可能比笛卡尔连接更有效(取决于数据大小); conditional_join from pyjanitor 可以提供帮助:
# pip install pyjanitor
import pandas as pd
import janitor
(df.conditional_join(df, ('Val1', 'Val1', '<'))
.loc(axis=1)[:, 'Col1']
.to_numpy()
.tolist()
)
[['asd', 'pqer'], ['asd', 'psdf'], ['pqer', 'psdf']]