簡體   English   中英

使用 For 循環屏蔽 Zip 代碼 Python Pandas

[英]Masking Zip Codes with a For Loop Python Pandas

我正在嘗試編寫一個 for 循環,循環遍歷數據框並根據人口分配給定 zip 代碼的 0 或前三位數字。 我的助教說我需要修復第二行以遍歷索引而不是數據幀的長度,但我不確定如何前進。 這是問題和我的代碼。

“在這部分,您應該編寫一個 for 循環,通過每個用戶更新 df_users dataframe.Go,並更新他們的 zip 代碼,以符合安全港規范:如果用戶來自 zip 代碼,“地理細分”是小於等於 20,000,將 df_users 中的 zip 代碼更改為“0”(作為字符串)。否則,zip 應該只是完整 zip 代碼的前 3 個數字。通過直接更新 df_users 的 zip 列來完成所有這些操作DataFrame。”

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

使用.applynp.where

  • 不建議使用帶有 pandas dataframe 的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

  • 你不應該,這是一個pandas反模式
  • range(0, len(df_users))0, 1, ..., len(df)-1生成一個列表,但是,索引可能不是從0, 1, ...開始的數字排序。 這可能就是您被指示更改為df.index的原因
  • 據推測,zip 代碼是數字。 (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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM