我正在尝试编写一个for循环,该循环遍历数据帧并根据总体分配给定邮政编码的0或前三位。我的助教说,我需要修正第二行以遍历索引而不是数据帧的长度,但是我不确定如何前进。这是问题和我的代码。
“在这部分中,您应该编写一个for循环,更新df_users数据框。遍历每个用户,并将其邮政编码更新为安全港规范:如果用户来自“地理位置” “细分”小于20,000,请将df_users中的邮政编码更改为“ 0”(作为字符串)。否则,邮政编码应仅是完整邮政编码的前3个数字。通过直接更新邮政编码列来完成所有操作df_users数据框。”
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
答案 0 :(得分:0)
.apply
和np.where
for-loop
与pandas数据框一起使用,这会导致性能下降。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
pandas
anti-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
列为object
或str
类型,则可以使用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]