【问题标题】:Pandas replacing values in columns, but to_replace argument is a tuple containing tuplesPandas 替换列中的值,但 to_replace 参数是包含元组的元组
【发布时间】:2020-04-08 13:36:43
【问题描述】:

我正在解码 NLSY 79 中的值。它们是职业行业。每个行业都有多个职业;例如:从 17 岁到 29 岁的所有职业都在农业、林业和渔业。我尝试了三种策略,但是两种返回错误,第三种没有将值存储在数据框中。

执行代码如下(调查对象最多可以列出 5 个工作,所有这些都包含在数据中)

df[['Job1', 'Job2', 'Job3', 'Job4', 'Job5']].replace(to_replace=jobs['code'], value=jobs['true'], inplace=True)

策略 1

ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()

jobs = {'code': ( tuple(range(17,29)), ... )
        'true': ( 'Agriculture, Forestry & Fisheries', ... )

策略 2

TypeError: 无法比较类型 'ndarray(dtype=float64)' 和 'range'

jobs = {'code': ( range(17,29), ... )
        'true': ( 'Agriculture, Forestry & Fisheries', ... )

策略 3

SettingWithCopyWarning:试图在 DataFrame 中的切片副本上设置值

jobs = {'code': ( any(tuple(range(17, 29))), any(tuple(range(47, 58))), ... )
        'true': ( 'Agriculture, Forestry & Fisheries', 'Mining', ... )

我认为对第三个策略/执行代码进行调整是最好的,但我对编码还是很陌生,不确定它会是什么。有关如何解决此问题的任何建议?

Input:
        Job1      ...  
0       339       ...  
1       757       ...  
2       739       ...  
3       448       ...  

Desired Output:

        Job1            ...  
0       Utilities       ...  
1       Professional    ...  
2       Professional    ...  
3       Retail          ...

job = {'code': (list(range(17, 29)),
                   list(range(47, 58)),
                   list(range(67, 78)), ...)
       'true': ('Agriculture, Forestry & Fisheries',
                  'Mining',
                  'Construction', ...)}

【问题讨论】:

    标签: python pandas replace data-cleaning iterable


    【解决方案1】:

    试试这个:

    df1
            Job1
    0       20
    1       50
    2       70
    
    job = {'code': (list(range(17, 29)),
                       list(range(47, 58)),
                       list(range(67, 78))),
           'true': ('Agriculture, Forestry & Fisheries',
                      'Mining',
                      'Construction')}
    
    pd_replace = pd.DataFrame(job).explode('code')
    df1.replace(dict(zip(pd_replace['code'], pd_replace['true'])))
    
                                    Job1
    0  Agriculture, Forestry & Fisheries
    1                             Mining
    2                       Construction
    

    【讨论】:

    • 工作并将运行时间缩短了一半!一个问题是我一次只能针对一列执行此操作,因此我必须遍历 5 个作业列。我能做些什么来保持这一点吗?
    【解决方案2】:

    解决了。不是最快的方法,但它有效。

    job = {'code': (list(range(17, 29)), ...),  
           'true': ('Agriculture, Forestry & Fisheries', ...)}  
    
        for i, x in enumerate(job['code']):  
            for key in df_jobs:  
                df[key].replace(to_replace=x, value=[job['true'][i]]*len(x), inplace=True)  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-14
      • 2018-07-22
      • 2021-12-07
      • 1970-01-01
      • 2018-03-28
      • 1970-01-01
      • 2021-07-16
      • 2020-08-13
      相关资源
      最近更新 更多