替换列中的值,但to\u replace参数是一个包含元组的元组

2024-09-28 19:23:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

策略1

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

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

策略2

TypeError: Cannot compare types 'ndarray(dtype=float64)' and 'range'

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

策略3

SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a 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', ...)}

Tags: truevaluejobscodeanyrange策略list
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)  

试试这个:

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

相关问题 更多 >