【问题标题】:How to efficiently replace values in a dataframe by iterating through a dictionary?如何通过遍历字典有效地替换数据框中的值?
【发布时间】:2020-03-16 21:02:33
【问题描述】:

我有一个工资范围的数据框,如下所示:

import pandas as pd
df = pd.DataFrame(columns=['Salary'])
df.Salary = ['30,000-39,999', '5,000-7,499', '250,000-299,999', '4,000-4,999', '60,000-69,999', '10,000-14,999', '80,000-89,999', '$0-999', '2,000-2,999', '70,000-79,999', '90,000-99,999', '125,000-149,999', '$0-999', '$0-999', '40,000-49,999', '20,000-24,999', '125,000-149,999', '$0-999', '10,000-14,999', '15,000-19,999', '20,000-24,999', '100,000-124,999', '$0-999']
df

我想用数字替换这些工资范围的字符串值,其中 1 表示$0-999,2 表示1000-1999,等等。所以,下面是我执行此操作的代码,我在其中进行字典映射将字符串转换为数字,并使用 2 个 for 循环 - 一个循环遍历数据框中的每一行,一个循环遍历字典中的每个元素:

salary_dict = {'$0-999':1, '1,000-1,999':2, '2,000-2,999':3, '3,000-3,999':4, '4,000-4,999':5, 
           '5,000-7,499':6, '7,500-9,999':7, '10,000-14,999':8, '15,000-19,999':9, '20,000-24,999':10, 
           '25,000-29,999':11, '30,000-39,999':12, '40,000-49,999':13, '50,000-59,999':14, '60,000-69,999':15, 
           '70,000-79,999':16, '80,000-89,999':17, '90,000-99,999':18, '100,000-124,999':19, '125,000-149,999':20, 
           '150,000-199,999':21, '200,000-249,999':22, '250,000-299,999':23, '300,000-500,000':24, '> $500,000':25}

for i in range(len(df)):
    for key in salary_dict:
        if df.Salary[i]==key:
            df.Salary[i] = salary_dict[key]
            break

df

这对于小型数据帧是可以的,但是对于更大(更长)的数据帧,代码需要很长时间才能完成运行。如何优化?

【问题讨论】:

    标签: python performance loops dataframe for-loop


    【解决方案1】:
    • 最有效的方法是使用系列apply函数。 https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.apply.html
    • 在系列上使用apply 函数将定义的任何函数应用于每个元素。
    • 在这里,我们将df['Salary'] 的每个元素映射到其在字典中的等效值。
    • 如果你不明白这部分 lambda x: salary_dict.get(x, x) 查看 python lambdas。
    • 另外,字典上的 get 方法仅用于保护密钥不在字典中。
    df['Salary'] = df['Salary'].apply(lambda x: salary_dict.get(x, x))
    print(df)
    

    输出:

       Salary
    0   12
    1   6
    2   23
    3   5
    4   15
    5   8
    6   17
    7   1
    8   3
    9   16
    10  18
    11  20
    12  1
    13  1
    14  13
    15  10
    16  20
    17  1
    18  8
    19  9
    20  10
    21  19
    22  1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-10
      • 2018-08-21
      • 1970-01-01
      • 2017-08-23
      • 2019-06-04
      • 2017-07-06
      • 2019-05-29
      • 2021-02-26
      相关资源
      最近更新 更多