使用For循环屏蔽邮政编码

2024-04-26 13:07:16 发布

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

我正在尝试编写一个for循环,该循环在数据帧中循环,并根据人口分配0或给定邮政编码的前三位数字。我的助教说我需要修正第二行以循环索引,而不是数据帧的长度,但我不确定如何前进。这是问题和我的代码

在这一部分中,您应该编写一个for循环,更新df_用户数据框。检查每个用户,并更新其邮政编码,以符合安全港规范:如果用户来自的邮政编码的“地理分区”小于等于20000,请将df_用户中的邮政编码更改为“0”(作为字符串)。否则,zip应仅为完整邮政编码的前3个数字。通过直接更新df_users数据框的zip列来完成所有这些。”

for item in range(0, len(df_users)):

    population = zip_dict[df_zip.loc[item, 'population']]
    if population <= 20000:
        df_users.loc[item, 'zip'] = '0'
    else: 
        new_zip = (df_users.loc[item, 'zip'])[:3]
        df_users.loc[item, 'zip'] = new_zip

Tags: 数据用户dfnewfor数字zipitem
1条回答
网友
1楼 · 发布于 2024-04-26 13:07:16

使用^{}^{}

  • 不建议将for-loop与熊猫数据帧一起使用,这会导致性能不佳
import pandas as pd
import numpy as np

# dataframe example
df = pd.DataFrame({'pop': [10000, 20000, 30000], 'zip': [12345, 97000, 87390]})

   pop    zip
 10000  12345
 20000  97000
 30000  87390

# update zip based on pop
df['zip'] = df.apply(lambda x: np.where(x['pop'] < 20000, '0', str(x['zip'])[:3]), axis=1)

   pop  zip
 10000    0
 20000  970
 30000  873

如果必须使用for-loop

  • 你不应该,这是一个pandasanti-pattern
  • range(0, len(df_users))0, 1, ..., len(df)-1生成一个列表,但是,索引不能从0, 1, ...按数字顺序排列。这可能就是为什么指示您更改为df.index
  • 大概,邮政编码是数字的(df_users.loc[item, 'zip'])[:3]不能与int一起使用,这就是为什么使用str(df.loc[i, 'zip'])[:3]。如果zip列是objectstr类型,则可以使用df.loc[i, 'zip'][:3]
for i in df.index:
    pop = df.loc[i, 'pop']
    if pop < 20000:
        df.loc[i, 'zip'] = '0'
    else:
        df.loc[i, 'zip'] = str(df.loc[i, 'zip'])[:3]

相关问题 更多 >