看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
pandas 相对于 numpy 等纯计算性库,最为强大的是复杂的数据处理能力,它能够帮助我们完成日常各种稀奇古怪的需求,同时丝毫不费力。你看,这个例子我们是怎么解决的。
使用我们的练习 team.csv 数据:
import pandas as pd
pd.__version__
# '1.4.2'
df = pd.read_csv('https://gairuo.com/file/data/team.csv')
df = df.head()
df
'''
name team Q1 Q2 Q3 Q4
0 Liver E 89 21 24 64
1 Arry C 36 37 37 57
2 Ack A 57 60 18 84
3 Eorge C 93 96 71 78
4 Oah D 65 49 61 86
'''
在以上数据中,有 name、team 两列是字母,需求是将这整个数据中的所有大家字母替换为 26 个字母对应的序号,同时呢,要求这个序号是两位,意味着前几位是 01、02 这样的。
总结下就是,将数据中其中的大写字母 Abc 替换为 01bc、dB 替换为 d02,Z00 替换为 2600 之类。
由于大写字母数量只有 26 个,我们可以先创建一个字母与顺序的用字典形式的映射表。
然后,写一个函数,来对数据中的每个值进行处理,如果是字符类型则用映射表进行替换。
最后应用我们写的函数来处理数据中的每个值,就能得到最终的结果。
构造字母与序号的映射关系:
import string
# 将字母与 1-26 数字成对组合起来
str_map_temp = zip(string.ascii_uppercase, range(1, 27))
# 将 zip 对象转为字典,同时处理字母为字符,一位的向前补 0
str_map = {k:str(v).zfill(2) for k, v in str_map_temp}
str_map
'''
{'A': '01',
'B': '02',
'C': '03',
... (输出省略)
'Y': '25',
'Z': '26'}
'''
接下来写一个函数对每个值执行替换,注意,传入的是 df 数据中的单个值,是一个标量。
# 注: str|int 联合类型提示 Python 3.10 才开始支持
def func(x: str|int):
# print(type(x), x)
if isinstance(x, str):
ser = pd.Series([*x])
ser = ser.replace(str_map)
return ''.join(ser)
else:
return x
以上函数传入支持字符和数字,对数字不进行处理,对字符进行处理,逻辑是:
以上其实完成了一个拆分、处理、再组合的过程。
最后,将上边的函数应用到数据的每个值上:
(
df.applymap(func)
)
'''
name team Q1 Q2 Q3 Q4
0 12iver 05 89 21 24 64
1 01rry 03 36 37 37 57
2 01ck 01 57 60 18 84
3 05orge 03 93 96 71 78
4 15ah 04 65 49 61 86
'''
注意,我们写的函数是针对每个标题值的,所以要使用 applymap() 来应用。
这样就得到了我们(出题人)想要的结果。
(完)
更新时间:Aug. 18, 2024, 4:34 p.m. 标签:pandas 替换 字符 序号