首页 > 解决方案 > 如何在熊猫中用字典映射列值的一部分?

问题描述

我有一个如下所示的数据

data = [(datetime.datetime(2021, 2, 6, 18, 48, 18, 97962), u'London', u'New York', u'UPLOAD_LOW'), (datetime.datetime(2021, 2, 6, 18, 48, 18, 97962), u'Berlin', u'Tokyo', u'DOWNLOAD_HIGH'), (datetime.datetime(2021, 2, 6, 18, 47, 8, 209495), u'Paris', u'Toronto', u'DROP_LOW')]

这是在熊猫中加载时的外观

                        date  source destination          issue
0 2021-02-06 18:48:18.097962  London    New York     UPLOAD_LOW
1 2021-02-06 18:48:18.097962  Berlin       Tokyo  DOWNLOAD_HIGH
2 2021-02-06 18:47:08.209495   Paris     Toronto       DROP_LOW

现在我想将列中的值映射issue到字典。使用 pandasmap函数pandas.Series.map有助于完成工作。但问题是字典中要映射的键只包含列值的一部分。

下面是我的字典

issue_short_form_map = {
        "UPLOAD": "UP",
        "MEMORY": "MEM",
        "DOWNLOAD": "DN"
}

现在说我想issue用上面的字典映射列。通常这就是我所做的

df = pd.DataFrame(data)
df.columns = ["date", "source", "destination", "issue"]
# map the values in issue column to the dictionary. Anything that doesn't match, keep the original
df["issue"] = df["issue"].map(issue_short_form_map).fillna(df["issue"])

但问题是issue列中的值与键不直接匹配,但只有一部分匹配(在拆分_并获取第一部分之后)。

有什么方法可以_对列值进行拆分并将其映射到字典?任何不匹配的东西都应该保持原样。

我的最终输出应如下所示

                        date  source destination          issue
0 2021-02-06 18:48:18.097962  London    New York         UP_LOW
1 2021-02-06 18:48:18.097962  Berlin       Tokyo        DN_HIGH
2 2021-02-06 18:47:08.209495   Paris     Toronto       DROP_LOW

标签: pythonpandas

解决方案


您可以split先发布问题列,仅使用映射转换第一部分,然后将剩余部分添加回来:

splits = df['issue'].str.split('_')
short_issue = splits.str[0].map(issue_short_form_map).fillna(splits.str[0])
df['issue'] = short_issue + '_' + splits.str[1]

df
#                        date  source destination     issue
#0 2021-02-06 18:48:18.097962  London    New York    UP_LOW
#1 2021-02-06 18:48:18.097962  Berlin       Tokyo   DN_HIGH
#2 2021-02-06 18:47:08.209495   Paris     Toronto  DROP_LOW

推荐阅读