python - 如何在熊猫中用字典映射列值的一部分?
问题描述
我有一个如下所示的数据
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
解决方案
您可以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
推荐阅读
- oauth-2.0 - LinkedIn OAuth2 授权码为空
- facebook - Facebook 业务经理使用 Page API
- java - 从 docker 容器内部连接到 Cassandra
- python - 如何组合两个元组列表来创建嵌套字典?
- groovy - Groovy groupBy 在多个属性上并仅提取值
- angular - 错误:已部署的 Angular CLI 项目上的 StaticInjectorError
- python-3.x - Receursivley 读取文件的行
- tensorflow - 权重和神经网络
- visual-studio - 未指定已注册的 JIT 调试器
- c# - 带有 ASP.NET Core 的 Angular 项目模板:与 Bootstrap 4 一起使用