我有一个结构化的数据框
df = DataFrame({
'id':['1', '2'],
'Level 1':['1. text TXT.', '2. Text'],
'Level 2':['1.1.text.textext.', '2.1.Text TXT'],
'Level 3':[NaN, NaN],
'Level 4':['lowercase_text','lowercase_text2']})
目标是将每个值都大写,就像普通句子一样-仅将第一个单词的第一个字母大写,而所有首字母缩略词保持原样。
我已经尝试过df.apply(lambda x: x.str.capitalize())
,但是当段落编号和文本之间没有空格时,此方法会破坏首字母缩写并且不适用于段落标题。
因此,我们的想法是在句子标点符号的任何结尾处拆分每个值(同时保留拆分的符号),删除前导空格,选择列表中每个元素的第一个字符并将其大写。然后将其全部合并回适当间距的单元格值中。
对我来说,困难在于引用列表元素以大写它们。
结果应如下所示:
id | Level 1 | Level 2 | Level 3 | Level 4
--------------------------------------------------------------------
1 | 1. Text TXT. | 2. Text | NaN | Lowercase_text
2 | 1.1. Text. Textext. | 2.1. Text TXT | NaN | Lowercase_text2
NaN是实际的未定义值,表明它们应保持原样(.str方法将其转换为文本“ NaN”)。
原始数据框具有更多列,因此我想将代码应用于所有这些列。
预先感谢
答案 0 :(得分:2)
这是使用正则表达式的一种方法。
例如:
import re
def func(val):
if pd.isna(val):
return val
return re.sub(r"([0-9.\s])([a-z]+)", lambda x: "{}{}".format(x.group(1), x.group(2).capitalize()), val)
df = pd.DataFrame({
'id':['1', '2'],
'Level 1':['1. text TXT.', '2. Text'],
'Level 2':['1.1.text.textext.', '2.1.Text TXT'],
'Level 3':["NaN", "NaN"]})
df = df.applymap(func)
print(df)
输出:
id Level 1 Level 2 Level 3
0 1 1. Text TXT. 1.1.Text.Textext. NaN
1 2 2. Text 2.1.Text TXT NaN