pandas - 如何将不同的列值映射到一列
问题描述
我在下面有一个数据框:
import pandas as pd
df = pd.DataFrame({"SK":["EYF","EYF","RMK","MB","RMK","GYF","RMK","MYF"],
"SA":["a","b","tm","tmb","tm","cd","tms","alb"],
"C":["","11","12","13","","15","16","17"]})
df
我想将“SK”、“SA”和“C”的一些值映射到一个新列:
df["D"]= df["SK"].map({"EYF":1,"MB":2,"GYF":3})
df
df["D"]= df["SA"].map({"tm":4})
df
df["D"]= df["C"].map({"16":5,"17":6})
df
但是当我运行下一个映射函数时,前一个映射函数映射的“D”列值变成了 NaN。我想得到下面的df:
任何帮助将不胜感激。
解决方案
Series
您可以创建 3 系列,然后用Series.fillna
or替换以前的错误值Series.combine_first
:
a = df["SK"].map({"EYF":1,"MB":2,"GYF":3})
b = df["SA"].map({"tm":4})
c = df["C"].map({"16":5,"17":6})
df["D"] = a.fillna(b).fillna(c)
#alternative
df["D"] = a.combine_first(b).combine_first(c)
print (df)
SK SA C D
0 EYF a 1.0
1 EYF b 11 1.0
2 RMK tm 12 4.0
3 MB tmb 13 2.0
4 RMK tm 4.0
5 GYF cd 15 3.0
6 RMK tms 16 5.0
7 MYF alb 17 6.0
如果某些值相同匹配,则顺序对于优先级很重要:
df = pd.DataFrame({"SK":["EYF","EYF"],
"SA":["a","tm"],
"C":["16","17"]})
a = df["SK"].map({"EYF":1,"MB":2,"GYF":3})
b = df["SA"].map({"tm":4})
c = df["C"].map({"16":5,"17":6})
df["D1"] = a.fillna(b).fillna(c)
df["D2"] = b.fillna(a).fillna(c)
df["D3"] = c.fillna(b).fillna(a)
print (df)
SK SA C D1 D2 D3
0 EYF a 16 1 1.0 5
1 EYF tm 17 1 4.0 6
推荐阅读
- sql - 使用 PostgreSQL \COPY
- python - 将表拆分为多个数据框
- java - 当我使用 Camera2Api 拍照时,Android 图像被旋转
- mongodb - Docker 上的 MongoDB 错误:将集合 config.transactions 标记为集合版本:
- spring-boot - 使用 WebClient 设置超时
- javascript - 在 HTML 中动态添加 js 脚本标记元素 - 幕后发生了什么?
- c# - 使用实体框架的外键问题
- javascript - Antd 选择搜索框不渲染匹配项
- ms-access - Ms-Access 2016 在 DAO.Recordset OpenRecordset(
- jquery - JQuery 上下滑动不适用于慢速效果