You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于街道奇偶编号与路段范围正确分配基础扇区的逻辑问题求助

基于街道奇偶编号与路段范围正确分配基础扇区的逻辑问题求助

我实在搞不懂这个问题了😭。我有两个DataFrame:first_df和second_df。其中first_df存储的是街道路段信息,包括街道名称、路段的起止门牌号,以及该路段是对应偶数还是奇数门牌号。second_df则包含门牌号和对应的地址信息。

我的目标是根据first_df里的信息,给second_df中的每个门牌号分配正确的“Secteur Elementaire”(基础扇区)。这个过程需要通过三个检查:

  • 检查街道名称是否存在(并创建只包含该街道对应元素的子集DataFrame)
  • 检查门牌号是否在first_df['Début']和first_df['Fin']定义的范围内
  • 检查门牌号的奇偶性,并根据其所属的奇偶路段分配对应的扇区

现在我遇到的问题是,根据门牌号奇偶性确定正确扇区的逻辑没有按预期工作,在某些情况下分配了错误的扇区。

我的代码实现

import pandas as pd

first_df = pd.DataFrame({
    'Voie': ['AVENUE D EPERNAY', 'AVENUE D EPERNAY', 'AVENUE D EPERNAY', 'AVENUE D EPERNAY'],
    'Périmètre élémentaire': ['PROVENCAUX', 'AVRANCHES', 'MAISON BLANCHE', 'SCULPTEURS JACQUES'],
    'Périmètre maternelle': ['AUVERGNATS-PROVENCAUX', 'AVRANCHES', 'MAISON BLANCHE', 'SCULPTEURS JACQUES'],
    'Début': [142, 1, 73, 2],
    'Fin': [998, 71, 999, 140],
    'Partie': ['Pair', 'Impair', 'Impair', 'Pair']
})

second_df = pd.DataFrame({
    'numero': [1, 2, 6, 7, 8, 9, 10, 12],
    'nom_afnor': ['AVENUE D EPERNAY', 'AVENUE D EPERNAY', 'AVENUE D EPERNAY', 'AVENUE D EPERNAY', 'AVENUE D EPERNAY', 'AVENUE D EPERNAY', 'AVENUE D EPERNAY', 'AVENUE D EPERNAY'],
    'Secteur Elementaire': ['tbd', 'tbd', 'tbd', 'tbd', 'tbd', 'tbd', 'tbd', 'tbd']
})


def sort_df(first_df, second_df):
    for bano_index, row in second_df.iterrows():
        street_number = row['numero']
        street_name = row['nom_afnor']

        if street_name in first_df['Voie'].values: # 检查街道名称是否存在
            reims_filtered = first_df.loc[first_df['Voie'] == street_name] # 创建匹配该街道的子集DataFrame
            for reims_index, reims_matching_row in reims_filtered.iterrows(): # 遍历子集的每一行
                if street_number >= reims_matching_row['Début'] and street_number <= reims_matching_row['Fin']: # 检查门牌号是否在路段范围内
                    if street_number % 2 == 0: # 检查门牌号是否为偶数
                        print(reims_index, street_number, reims_matching_row['Partie'])
                        if reims_matching_row['Partie'] == 'Pair': # 如果是偶数,检查路段是否对应偶数扇区
                            print(f'Check column {street_number} {reims_matching_row['Périmètre élémentaire']}')
                            sector_to_assign = reims_matching_row['Périmètre élémentaire']
                            second_df.at[bano_index, 'Secteur Elementaire'] = sector_to_assign
                            break
                    else:
                        print(f'Check odd {street_number} {reims_matching_row['Périmètre élémentaire']}')
                        sector_to_assign = reims_matching_row['Périmètre élémentaire']
                        second_df.at[bano_index, 'Secteur Elementaire'] = sector_to_assign
                    break

    return second_df

sort_df(first_df, second_df)

运行代码后的输出

Check odd 1 AVRANCHES
1 2 Impair
1 6 Impair
Check odd 7 AVRANCHES
1 8 Impair
Check odd 9 AVRANCHES
1 10 Impair
1 12 Impair
   numero         nom_afnor Secteur Elementaire
0       1  AVENUE D EPERNAY           AVRANCHES
1       2  AVENUE D EPERNAY                 tbd
2       6  AVENUE D EPERNAY                 tbd
3       7  AVENUE D EPERNAY           AVRANCHES
4       8  AVENUE D EPERNAY                 tbd
5       9  AVENUE D EPERNAY           AVRANCHES
6      10  AVENUE D EPERNAY                 tbd
7      12  AVENUE D EPERNAY                 tbd

很明显,奇偶性判断的逻辑有问题,尤其是在判断reims_matching_row['Partie'] == 'Pair'这部分。有没有大佬能给点思路?

备注:内容来源于stack exchange,提问作者Louis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 19:13:10