我有两个数据框,
first_df
和
second_df
,其中包含有关街道细分市场的信息,包括街道名称,街道细分市场的开始和结束数字,以及该细分市场是否适用于偶数或奇数。 first_df
包含街道数字及其相应的地址。
目标是根据
second_df
中的信息将正确的“宗派元素”(基本部门)分配给
second_df
中的每个街道号。因此,它需要通过三个检查:检查StreetName是否存在(并创建一个仅包含与此StreetName相对应的Elemnts的子集数据框架)检查Streetnumber是否在
first_df
first_df['Début']
检查它是偶数还是奇数,并根据该扇区的数字是偶数或奇数扇区的一部分分配的。
我面临的问题是,基于街道号是否偶数还是奇数无法正常工作,确定正确部门的逻辑。当前的实施在某些情况下分配了错误的部门。
first_df['Fin']
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']
#print(f'first loop: {num_de_rue}')
if street_name in first_df['Voie'].values: # check if street name exists
reims_filtered = first_df.loc[first_df['Voie'] == street_name] # if it does create a dataframe containing only the elements matching the street name
#print(reims_filtered)
for reims_index, reims_matching_row in reims_filtered.iterrows(): # iterate over the rows the filtered dataframe
#print(reims_matching_row)
if street_number >= reims_matching_row['Début'] and street_number <= reims_matching_row['Fin']: # check if street number is between range of street segment
#print(f'Check range {street_number} {reims_matching_row['Périmètre élémentaire']}')
if street_number % 2 == 0: # check if street number is even
print(reims_index, street_number, reims_matching_row['Partie'])
if reims_matching_row['Partie'] == 'Pair': # if it is even, then check which sector should be taken to be assigned based on street segment and its corresponding odd/even sector
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'
如果第一个行“ partie”不是“对”,那么您不会分配任何东西,并且您将在else语句以下的休息时间,退出循环。
要修复它,我们可以添加要求它与您的条件匹配的要求:
对数据的大小进行缩减,您可以想象一个街道的子集,然后在一个范围内加入以加快速度。