如何拆分数据框值并将函数应用于列表的内容

时间:2019-09-12 11:24:31

标签: python pandas

我有一个结构化的数据框

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”)。

原始数据框具有更多列,因此我想将代码应用于所有这些列。

预先感谢

1 个答案:

答案 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