Python仅从2个数据帧中选择第一个匹配项

2024-09-29 21:33:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在Python3.5中的2个数据帧上实现一种连接功能,逻辑上的唯一区别是,它应该只提供第一个匹配作为输出,而忽略其余的匹配记录

例如以下-

输入数据帧-

ID | Name
1 | Sanket
1 | Sanket
1 | Sanket
2 | Robin
2 | Robin
3 | Vishal
3 | Vishal  

查找数据帧-

ID | Name
1 | Sanket
2 | Robin
3 | Vishal
4 | Umesh

我的加入条件是Lookup.name>;输入.名称

因此,对于Input.ID==1,在查找“Vishal”和“Umesh”中有2个匹配项,它应该只提供第一个匹配项,即“Vishal”,而忽略其余的匹配记录

对于Input.ID==2,有3个匹配项“Sanket”、“Vishal”和“Umesh”,它应该只提供第一个匹配项,即“Sanket”,而忽略其余的匹配项

输出应为-

Input.ID | Input.Name | Lookup.ID | Lookup.Name
1 | Sanket | 3 | Vishal
1 | Sanket | 3 | Vishal
1 | Sanket | 3 | Vishal
2 | Robin | 1 | Sanket
2 | Robin | 1 | Sanket
3 | Vishal | NaN | NaN
3 | Vishal | NaN | NaN

我主要尝试了以下两件事,如果需要,我可以提供代码-

  1. pandas.DataFrame.merge=这里我不能使用“>;”条件,因为它只支持两列上的“=”条件。使用“=”条件,我将获得预期的输出
  2. 使用带有一些嵌套联接和逻辑的pandasql编写SQL查询,但它没有提供预期的输出。这是我正在执行的查询-
select IP.*, Lookup.[ID] as [lookup_ID],Lookup.[Name] as [lookup_Name]
from InputDF IP
LEFT join
(
select  Lookup.* from InputDF IP LEFT join LookupDF Lookup on [Lookup].[Name] > [IP].[Name] limit 1
)
Lookup
on [Lookup].[Name] > [IP].[Name]

在查询中,由于“limit1”子句,它为所有输入行提供了“Vishal”作为lookup.Name

总而言之,我试图将其作为excel Vlookup函数使用,只使用“>;”条件

有人能帮忙并提出一些方法来让这项工作顺利进行吗

谢谢大家!! 桑克特凯尔卡


Tags: 数据namegtipidinput逻辑nan
1条回答
网友
1楼 · 发布于 2024-09-29 21:33:06

这里有一种方法你可以试试

首先,对两个数据帧执行交叉连接或笛卡尔积

def cartesian_product_basic(left, right):
    return (
       left.assign(key=1).merge(right.assign(key=1), on='key').drop('key', 1))


df_combined = cartesian_product_basic(df_input, df_lookup)

重命名列

df_combined.columns = ["input_id", "input_name", "lookup_id", "lookup_name"]

使用密集列组将查找行与输入行正确配对

df_combined = df_combined.loc[df_combined["lookup_name"] > df_combined["input_name"]]
df_combined.loc[:, "row_rank"] = (
    df_combined.groupby(["input_id", "input_name"])['lookup_id'].rank(method='dense')
)
df_combined = df_combined.loc[df_combined["row_rank"] == 1]

在没有更大名称的行中添加,如本例中的Vishal

df_missing = df_input.merge(
    df_combined,
    how='left',
    left_on=['ID'],
    right_on=["input_id"],
    indicator=True
)

df_to_append = df_missing.loc[df_missing["_merge"] == "left_only", ["ID", "Name"]]
df_to_append.columns = ["input_id", "input_name"]
df_output = pd.concat([df_combined, df_to_append])

清除输出数据帧

df_output.drop(columns="row_rank", inplace=True)
df_output.reset_index(drop=True, inplace=True)
print(df_output)

输出

   input_id input_name  lookup_id lookup_name
0         1     Sanket        3.0      Vishal
1         1     Sanket        3.0      Vishal
2         1     Sanket        3.0      Vishal
3         2      Robin        1.0      Sanket
4         2      Robin        1.0      Sanket
5         3     Vishal        NaN         NaN
6         3     Vishal        NaN         NaN

注意:由于存在NaN值,lookup_id列显示为浮点

相关问题 更多 >

    热门问题