【问题标题】:pandas Series.replace() not generating default value from defaultdictpandas Series.replace() 没有从 defaultdict 生成默认值
【发布时间】:2021-10-10 04:59:35
【问题描述】:

之后我总是可以 .fillna() 。但我正在尝试将“OTHER”的值作为重新编码字典的一部分。我认为 defaultdict 可能很合适,但它的行为似乎像一个生成器,并且 pandas Series.replace() 似乎不会为代码中之前未请求的键生成结果。

示例代码:

import pandas as pd
from collections import defaultdict

recode = defaultdict(lambda:"Unknown", {
    1 : "Yes",
    2 : "No"
})

print("key 0:", recode[0]) # Will generate a key-value for the key "0"

df = pd.DataFrame(pd.Series([0,1,2,5]), columns = ["code"])
df['answer'] = df['code'].replace(recode)
print(df)

将生成此输出:

key 0: Unknown
   code   answer
0     0  Unknown
1     1      Yes
2     2       No
3     5        5

因此,由于我们在 recode[0] 上调用了 print(),因此会生成它,并且可以由 pd.Series.replace() 使用,但 recode[5] 只能由 pd.Series.replace() 搜索,并且因此不会像我预期的那样被“未知”取代。

建议? (关于如何在重新编码数据结构中包含“其他”)

接受的答案

基于Anurag Dabass 的回答,您可以只使用地图...

recode = defaultdict(lambda:"Unknown", {
    1 : "Yes",
    2 : "No",
    None: "Ah shit"
})
df['answer'] = df['code'].map(recode)

输出:

    code    answer
0   0   Unknown
1   1   Yes
2   2   No
3   5   Unknown

【问题讨论】:

    标签: python pandas replace collections defaultdict


    【解决方案1】:

    当你这样做时:

    print("key 0:", recode[0])
    

    由于记录中不存在键 0,因此它将生成一个值为“未知”的键 0,因为您在 defaultdict 中创建 0 键时没有分配任何值

    所以现在重新编码变成:

    print(record)
    defaultdict(<function __main__.<lambda>()>, {1: 'Yes', 2: 'No', 0: 'Unknown'})
    

    所以现在如果你这样做:

    df['answer'] = df['code'].replace(recode)
    

    0 被替换为“未知”,因为默认字典重新编码中存在值 0,即“未知”,并且默认字典中不存在值 5,因此它保持不变,您可以通过以下方式检查:

    print('keys: ',recode.keys(),'\nvalues: ',recode.values())
    
    keys:  dict_keys([1, 2, 0]) 
    values:  dict_values(['Yes', 'No', 'Unknown'])
    

    更新:

    您可以使用简单的字典或带有map()+fillna()的默认字典:

    df['answer'] = df['code'].map({1:'Yes',2:'No'}).fillna('Other')
    

    df的输出:

        code    answer
    0   0       Other
    1   1       Yes
    2   2       No
    3   5       Other
    

    【讨论】:

    • @CarlF.Corneil 先生,您想要像 ['other','yes','no','other'] 这样的答案列值吗?
    • @CarlF.Corneil 更新了答案....请看一下:)
    • 啊,很好。是的,这也可以与 defaultdict 一起使用,方法是直接引用一个不应存在于 defaultdict 中的键。 df['answer'] = df['code'].map(recode).fillna(recode[None])
    • @CarlF.Corneil 但df['code'].map(recode).fillna(recode[None]) 将在 defaultdict 中为每个“未知”值创建附加条目
    • 我想也许我用一个没有 .fillna 的纯 .map 得到了想要的结果 就像你说的那样,map 函数会在 defaultdict 中创建新条目,但这很好。对我来说,defaultdict可以正确输入代码,比使用后保存更重要。
    【解决方案2】:

    看起来像 pandas.core _replace_columnwise checks if the keys are in the mapping before replacing

    所以在上面的示例代码运行之后,你可以用逻辑检查哪些会被替换。

    print(0 in recode)
    print(5 in recode)
    

    输出:

    True
    False
    

    所以我想这是要问熊猫开发者,他们是否可以在替换功能中支持类似字典的生成器?

    【讨论】:

      猜你喜欢
      • 2015-08-02
      • 1970-01-01
      • 2015-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      • 2019-06-18
      相关资源
      最近更新 更多