首页 > 解决方案 > 根据字典替换数据框列中的值不起作用

问题描述

您可以阅读下面的确切问题,但这基本上是我想要做的:

df1 = pd.DataFrame({'A':['A0', 'A1', 'A2', 'A3'],
                        'B': ['B0', 'B1', 'B2', 'B3'],
                        'C': ['C0', 'C1', 'C2', 'C3'],
                        'D': ['D0', 'D1', 'D2', 'D3']})

newVals = dict({'A0': 0,
             'A1': 1,
              'A2': 2,
             'A3': 3})
for key, value in newVals.items():
    df1['A'].replace({key, value})

当我这样做时,生成的数据框没有任何变化。

初始帖子:

好的,我正在分析来自 OSHA (osha_accident_injury.csv) 的工作场所事故的数据。每一行都是在事故中受伤的特定人员。每列都是人或事故本身的特征。并且每个特征都被编码为具有相应字符串值的整数。我想用它的字符串定义替换每个整数。数字到字符串的映射列在 osha_accident_lookup.csv 中。事故代码的映射可以在 osha_accident_dictionary.csv 中找到,但我手动将它们输入到地图中。

但是,一些整数映射到多个字符串,因此它还取决于 osha_accident_lookup.csv 中的事故代码。因此,我创建了一个列表,其中包含每个特定事故代码的字典(将整数映射到字符串值)。但是,当我尝试用其特定的字典替换每一列时,它会返回原始数据框,而不是带有字符串值的数据框。谁能看到我做错了什么?

# create list of all distinct accident codes
code_list = []
for index in osha_accident_lookup.index:
    if osha_accident_lookup['accident_code'][index] not in code_list:
        code_list.append(osha_accident_lookup['accident_code'][index])

# remove values not found in actual data
code_list.remove('PTYP')
code_list.remove('COST')
code_list.remove('ENDU')

# create list of dictionaries, s.t. each item maps accident number to accident value
# there is a unique map for each unique accident code
mapList = []
for code in code_list:
    temp_df = pd.DataFrame(osha_accident_lookup[osha_accident_lookup['accident_code'] == code])
    temp_map = dict(zip(temp_df['accident_number'], temp_df['accident_value']))
    mapList.append(temp_map)

# create dictionary that maps code from osha_accident_lookup to column name in osha_accident_injury.csv
code_to_column = dict({"OCC": "occ_code", 'CAUS': 'fat_cause', 'DEGR': 'degree_of_inj',
                          "OPER": "const_op_cause", "EN": 'evn_factor', "FT": 'event_type', "HU": 'hum_factor', "IN":
                           "nature_of_inj", "BD": "part_of_body", "SO": "src_of_injury", "TASK": 'task_assigned'})

# replace numbers in injury data with string values of what the #'s represent
iterator = 0
for item in mapList:
    code = code_list[iterator]
    col_name = code_to_column[code]
    for key, value in item.items():
        osha_accident_injury[col_name].replace({key: value})
    iterator += 1

osha_accident_injury.csv(前 10 行):

现场1 summary_nr rel_insp_nr 年龄 性别 Nature_of_inj part_of_body src_of_injury 事件类型 evn_factor 幽默因素 occ_code degree_of_inj task_assigned 危险品 const_op const_op_cause fat_cause fall_distance fall_ht 伤害线 load_dt
0 18 10006732 0 10.0 12.0 15.0 13.0 18.0 1.0 0.0 1.0 1.0 0.0 0.0 0.0 1 2017-03-20 01:00:11 美国东部时间
1 26 159996 0 21.0 19.0 42.0 5.0 13.0 9.0 0.0 1.0 1.0 0.0 0.0 0.0 1 2017-03-20 01:00:11 美国东部时间
2 34 10013225 0 21.0 4.0 19.0 8.0 18.0 1.0 0.0 1.0 1.0 0270 0.0 0.0 0.0 1 2017-03-20 01:00:11 美国东部时间
3 42 10014439 0 1.0 10.0 24.0 2.0 3.0 1.0 0.0 2.0 2.0 0.0 0.0 0.0 1 2017-03-20 01:00:11 美国东部时间
4 59 19523588 0 5.0 4.0 16.0 10.0 9.0 1.0 0.0 2.0 1.0 0.0 0.0 0.0 1 2017-03-20 01:00:11 美国东部时间
5 59 19523588 0 21.0 5.0 16.0 8.0 9.0 14.0 0.0 2.0 2.0 0.0 0.0 0.0 2 2017-03-20 01:00:11 美国东部时间
6 59 19523588 0 21.0 5.0 16.0 6.0 9.0 14.0 0.0 2.0 2.0 0.0 0.0 0.0 3 2017-03-20 01:00:11 美国东部时间
7 59 19523588 0 21.0 5.0 16.0 8.0 9.0 14.0 0.0 2.0 2.0 0.0 0.0 0.0 4 2017-03-20 01:00:11 美国东部时间
8 59 19523588 0 21.0 5.0 16.0 8.0 9.0 14.0 0.0 2.0 2.0 0.0 0.0 0.0 5 2017-03-20 01:00:11 美国东部时间
9 59 19523588 0 21.0 5.0 16.0 8.0 9.0 14.0 0.0 2.0 2.0 0.0 0.0 0.0 6 2017-03-20 01:00:11 美国东部时间

osha_accident_lookup.csv(前 10 行):

事故代码 事故编号 事故值 事故信 加载日期
操作员 1 回填和压实 2018-11-09 20:56:02 EST
操作员 2 沥青混凝土浇筑 2018-11-09 20:56:02 EST
操作员 3 建造运动场、网球场 2018-11-09 20:56:02 EST
所以 1 飞机 2018-11-09 20:56:02 EST
所以 2 空气压力 2018-11-09 20:56:02 EST
所以 3 动物/INS/REPT/等。 2018-11-09 20:56:02 EST
OCC 757 分离过滤澄清机 运营商 2018-11-09 20:56:02 EST
OCC 758 压缩和压实机器操作员 2018-11-09 20:56:02 EST
OCC 759 喷漆和喷漆机操作员 2018-11-09 20:56:02 EST
OCC 763 烘焙和烘焙机操作员,食品 2018-11-09 20:56:02 EST

osha_data_dictionary.csv(前 10 行):

表名 列名 属性名 定义 列数据类型 显示名称
osha_accident nonbuild_ht 非建筑高度 建筑 - 非建筑物时的高度(英尺) 数字,长度=4 非建筑高度
osha_accident 项目类型 项目类型 建筑 - 项目类型(代码表 PTYP) 字母数字,长度:1 项目类型
osha_accident 活动日期 活动日期 事故日期 (yyyymmdd) 数字,长度=8 活动日期
osha_accident 事件关键字 事件关键字 包含 ERG 在审核过程中输入的逗号分隔关键字。 字母数字,长度:200 事件关键字
osha_accident 报告ID 报告编号 确定 OSHA 联邦或州报告管辖区 数字,长度=7 报告 ID
osha_accident 事件描述 活动说明 事件的简短描述 字母数字,长度:60 活动说明
osha_accident load_dt 加载日期时间戳 加载完成的日期。 日期 无标签
osha_accident summary_nr 摘要 NR 识别事故 OSHA-170 表格 数字,长度=9 摘要 NR
osha_accident 死亡 死亡率 X=死亡与事故有关 字母数字,长度:1 死亡率

标签: pythonpandasdataframedictionaryreplace

解决方案


根据您的示例尝试此方法。

df1['A'] = df1['A'].map(newVals)

推荐阅读