如何在Pandas列中提取每个单词的首字符并保留整数?
解决DataFrame提取单词首字符并保留完整整数的问题
嘿,我明白你的需求了——要给DataFrame加个col2列,把col1里每个字母单词的首字符提出来大写,但是整数得完整保留对吧?你之前试的代码问题在于,不管是单词还是数字都只取了第一个字符,导致38变成了3,不符合预期。我来给你修正一下。
问题根源
你原来用re.findall("\w+", input)拆分字符串后,对每个元素都取item[0],数字38会被当成一个元素,取首字符就只剩3了,这就是为什么得不到GMH38的原因。我们得区分字母单词和数字,分别处理。
正确的实现方法
我们可以用正则表达式把字符串拆成数字段和字母单词段,然后对数字直接保留,对字母单词取首字符大写。结合Pandas的apply方法就能批量处理整列数据:
import pandas as pd import re # 构造示例DataFrame df = pd.DataFrame({ "col1": ["GRE MET HOCK 38", "ASS COM CORD EMERG INIT"] }) def transform_text(text): # 用正则匹配数字(\d+)或者字母单词([A-Za-z]+),拆分字符串 segments = re.findall(r"\d+|[A-Za-z]+", text) output_chars = [] for seg in segments: if seg.isdigit(): # 如果是数字,直接加入结果 output_chars.append(seg) else: # 如果是字母单词,取首字符并转大写 output_chars.append(seg[0].upper()) return "".join(output_chars) # 生成col2列 df["col2"] = df["col1"].apply(transform_text) # 查看结果 print(df)
运行后你会得到预期的输出:
col1 col2 0 GRE MET HOCK 38 GMH38 1 ASS COM CORD EMERG INIT ACCEI
代码说明
re.findall(r"\d+|[A-Za-z]+", text):这个正则表达式会精准拆分出所有数字和字母单词,不会把它们混在一起,比如"GRE MET HOCK 38"会被拆成["GRE", "MET", "HOCK", "38"]- 遍历拆分后的每个片段:判断是否是数字,是就直接保留,不是就取首字母大写
- 最后把所有片段拼接成字符串,赋值给
col2列
这样就完全满足你的需求啦!
内容的提问来源于stack exchange,提问作者A2N15
相关产品推荐
相关产品推荐

