将 pandas 列中的值替换为缺失键的默认值

Posted

技术标签:

【中文标题】将 pandas 列中的值替换为缺失键的默认值【英文标题】:Replace values in pandas column with default value for missing keys 【发布时间】:2019-05-05 05:46:39 【问题描述】:

我有多个简单的函数需要在我的数据框的某些列的每一行上实现。数据框非常像,超过 1000 万行。我的数据框是这样的:

Date      location   city        number  value
12/3/2018   NY       New York      2      500
12/1/2018   MN       Minneapolis   3      600
12/2/2018   NY       Rochester     1      800
12/3/2018   WA       Seattle       2      400

我有这样的功能:

def normalized_location(row):
    if row['city'] == " Minneapolis":
        return "FCM"
    elif row['city'] == "Seattle":
        return "FCS"
    else:
        return "Other"

然后我使用:

df['Normalized Location'] =df.apply (lambda row: normalized_location (row),axis=1)

这非常慢,我怎样才能提高效率?

【问题讨论】:

【参考方案1】:

我们可以使用mapdefaultdict 使这个BLAZING 更快。

from collections import defaultdict

d = defaultdict(lambda: 'Other')
d.update("Minneapolis": "FCM", "Seattle": "FCS")

df['normalized_location'] = df['city'].map(d)

print(df)
        Date location         city  number  value normalized_location
0  12/3/2018       NY     New York       2    500               Other
1  12/1/2018       MN  Minneapolis       3    600                 FCM
2  12/2/2018       NY    Rochester       1    800               Other
3  12/3/2018       WA      Seattle       2    400                 FCS

...为了性能原因绕过fillna 调用。这种方法很容易推广到多个替换。

【讨论】:

我可以谷歌 (***.com/questions/19798153/…),但您能简要解释一下或链接到defaultdict(lambda: 'Other') 行的解释吗?如果该位置不在dict 中,则将其设置为Other? @Evan 你知道了,当key不存在时,字典返回“Other”。 这真的很快。谢谢!!【参考方案2】:

您可能想使用np.select

conds = [df.city == 'Minneapolis', df.city == 'Seattle']
choices = ['FCM', 'FCS']

df['normalized_location'] = np.select(conds, choices, default='other')

>>> df
        Date location         city  number  value normalized_location
0  12/3/2018       NY     New York       2    500               other
1  12/1/2018       MN  Minneapolis       3    600                 FCM
2  12/2/2018       NY    Rochester       1    800               other
3  12/3/2018       WA      Seattle       2    400                 FCS

【讨论】:

每天学习新东西+1 只是一个小提示,对于每个替换,您都需要计算一个单独的掩码。【参考方案3】:

试试这个:

map_ = 'Minneapolis':'FCM', 'Seattle':'FCS'
df.loc[:,'city'] = df.loc[:,'city'].map(map_).fillna('Other')

print(df)
    Date      location  city    number  value
0  12/3/2018       NY  Other       2    500
1  12/1/2018       MN    FCM       3    600
2  12/2/2018       NY  Other       1    800
3  12/3/2018       WA    FCS       2    400

【讨论】:

【参考方案4】:

您可以使用嵌套的np.where()

df['city'] = np.where(df['city']=='Minneapolis', 'FCM', np.where(df['city']=='Seattle', 'FCS', 'Other'))

【讨论】:

这比np.select的嵌套深度快3。

以上是关于将 pandas 列中的值替换为缺失键的默认值的主要内容,如果未能解决你的问题,请参考以下文章

如果不是 NAN,则用以前的值替换 Pandas 中的缺失值

Pandas DataFrame:根据条件替换列中的所有值

将 2 列中的值合并为 pandas 数据框中的单列

Python - SkLearn Imputer 用法

在 Pandas 数据框列中填充缺失的日期值

Pandas 替换列中的值,但 to_replace 参数是包含元组的元组