根据字典中定义的映射为列分配值

问题描述 投票:0回答:1

我正在尝试实现一个代码,该代码读取 csv 文件,从中创建一个数据框,然后为每一行标记键的名称(如果该行中的一列包含与键中相同的字符串)数据框。

作为示例,我定义了以下字典:

Sdiction={
        "Mgage" : ["ABC Gage","XYZ Gage"],
        "Rate" : ["deg/min","rad/s","rpm"]}

我有以下数据框:

A 栏 B 栏 C 座 D 座
1 30 ABC 计
2 45 度/分钟
3 150 量规

我想将每行的 D 列标记为

第 1 行 - D 列 = Mgage(因为 ABC Gage 存在于密钥 Mgage 中)

第 2 行 - D 栏 = 速率(因为关键速率中存在度/分钟)

第 3 行 - Col D = Mgage(因为字符串 Gage 存在于键 Mgage 中,尽管是部分存在)

我正在尝试弄清楚如何实现这部分,尚未实现,因此需要帮助。

pandas dataframe dictionary tagging
1个回答
0
投票

使用正则表达式匹配:

import re

s = df['Col C'].str.casefold()
pattern = '(%s)' % '|'.join(map(re.escape, s))
# '(abc\\ gage|deg/min|gage)'

# reverse dictionary
tmp = pd.Series({v.casefold(): k for k, l in Sdiction.items()
                 for v in l}, name='ref').reset_index()

# extract first match, map reference key
df['Col D'] = s.map(tmp.assign(match=tmp['index'].str.extract(pattern))
                       .dropna(subset=['match'])
                       .set_index('match')['ref']
                    )

输出:

   Col A  Col B     Col C  Col D
0      1     30  ABC Gage  Mgage
1      2     45   deg/min   Rate
2      3    150      Gage  Mgage
© www.soinside.com 2019 - 2024. All rights reserved.