pandas Python中的R fuzzyjoin

qjp7pelc  于 2023-05-05  发布在  Python
关注(0)|答案(2)|浏览(100)

fuzzyjoin是一个R库,它允许基于函数进行连接,而不是id的相等。我想知道同样的事情是否可以在Python中完成。例如,我可能想基于两个不等式进行连接。我有以下 Dataframe :

import pandas as pd
df = pd.DataFrame(dict(
    x=range(10)
))

other_df = pd.DataFrame(dict(
    min_x=[0, 6],
    max_x=[5, 10],
    category=['a', 'b']
))

我想左连接dfother_df,使得x >= min_xx <= max_x,获得以下 Dataframe :

x category
0  0        a
1  1        a
2  2        a
3  3        a
4  4        a
5  5        a
6  6        b
7  7        b
8  8        b
9  9        b

有没有一种简单的方法可以在Pandas身上做到这一点?

1zmg4dgp

1zmg4dgp1#

在Python中也可以这样做。可按以下方式进行─

import pandas as pd
df = pd.DataFrame(dict(
    x=range(10)
))

other_df = pd.DataFrame(dict(
    min_x=[0, 6],
    max_x=[5, 10],
    category=['a', 'b']
))

df['category'] = df['x'].apply(lambda x: other_df.loc[(other_df['min_x'] <= x) & (other_df['max_x'] >= x), 'category'].item())

print(df)

我使用pandas apply对列中的每个项执行相同的函数(在本例中是lambda函数)。在apply函数中,我执行了loc函数,根据other_df中的条件查找值,并使用这些值构建了一个新列。

igetnqfo

igetnqfo2#

一个有效的选择是使用janitor.conditional_join:

# pip install pyjanitor
import janitor 
import pandas as pd
(df
.conditional_join(
    other_df, 
    ('x', 'min_x', '>='), 
    ('x', 'max_x', '<='), 
    right_columns = 'category')
) 
   x category
0  0        a
1  1        a
2  2        a
3  3        a
4  4        a
5  5        a
6  6        b
7  7        b
8  8        b
9  9        b

由于other_df的范围没有重叠,因此pd.merge_asof就足够了:

(pd
.merge_asof(
    df, 
    other_df, 
    left_on = 'x', 
    right_on = 'min_x')
.loc(axis=1)[['x', 'category']]
)
0  0        a
1  1        a
2  2        a
3  3        a
4  4        a
5  5        a
6  6        b
7  7        b
8  8        b
9  9        b

相关问题