文章目录

  • 一、apply
  • 先读入文件
  • 这里的问题相当于是对Series求解,使用apply结合lambda迭代每一列的值
  • 小结1:
  • 二、矢量化字符串
  • 我们使用的是文本数据,要想对每个元素进行操作,一般使用str属性,可方便使用操作;
  • 2.1 .str.lower
  • series获取属性,其实和java类似,都是以"."的方式获取属性和方法。
  • 小结2:
  • 2.2 替换和分割
  • 2.2.1 替换
  • 替换用str.replace("old_string","new_string");
  • 一些常用术语
  • 语法:
  • 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
  • 普通字符
  • 特殊字符
  • 2.2.2 分割
  • 小结3:


一、apply

  • apply作用就是迭代每一列的值
    展示apply的作用
先读入文件
df = pd.read_csv('table.csv')
df.head()

data的长度和kb ios data_object_l_size_ci

  • Series

Q1:现在需要把Math这一列的所有值后面加上!
S:

这里的问题相当于是对Series求解,使用apply结合lambda迭代每一列的值
df['Math'].apply(lambda x: str(x)+'!').head()

data的长度和kb ios data_object_l_size_python_02

  • DataFrame

Q2: 现在给这个表的所有列均加上符号!
S:

df.apply(lambda x: x.apply(lambda x: str(x)+'!')).head()

data的长度和kb ios data_object_l_size_data的长度和kb ios_03

小结1:

第一部分主要的知识点为学会运用apply并理解掌握;
记住给一个表的某一或几列的所有值加上特殊符号:变成str形式+特殊符号;

二、矢量化字符串

1、为何使用str属性?

我们使用的是文本数据,要想对每个元素进行操作,一般使用str属性,可方便使用操作;

2、举个栗子

我们先创建一个dataframe

index = pd.Index(data=["Tom", "Bob", "Mary", "James", "Andy", "Alice"], name="name")

data = {
    "age": [18, 30, np.nan, 40, np.nan, 30],
    "city": ["Bei Jing ", "Shang Hai ", "Guang Zhou", "Shen Zhen", np.nan, " "],
    "sex": [None, "male", "female", "male", np.nan, "unknown"],
    "birth": ["2000-02-10", "1988-10-17", None, "1978-08-08", np.nan, "1988-10-17"]
}

user_info = pd.DataFrame(data=data, index=index)

# 将出生日期转为时间戳
user_info["birth"] = pd.to_datetime(user_info.birth)
user_info

data的长度和kb ios data_object_l_size_正则表达式_04


!!!强调apply作用:在对 Series 中每个元素处理时,我们可以使用apply 方法。

【关系】在对DataFrame单独取一列元素=Series

2.1 .str.lower

Q3:把city全部变成小写
S:

user_info.city.str.lower()

data的长度和kb ios data_object_l_size_正则表达式_05


【回忆助记】

  • 为啥这种写法可行user_info.city?来源是?
    答:我们需要解决的是对这个表(DF型)的city列的所有值全部变成小写:那这种形式其实是Series,取Series的值,采用.value;
series获取属性,其实和java类似,都是以"."的方式获取属性和方法。

小结2:

对Series的元素转换大小写等字符串问题的,采取str属性;
df.city.str.lower

2.2 替换和分割

2.2.1 替换

使用.str属性不仅支持大小写转换求长度等,还支持替换和分割操作;

Q4: 把city这一列空字符串用_替换
S:

替换用str.replace(“old_string”,“new_string”);
user_info.city.str.replace(' ',"_")

data的长度和kb ios data_object_l_size_data的长度和kb ios_06

  • replace支持正则表达式
user_info.city.str.replace("^S.*"," ")

data的长度和kb ios data_object_l_size_正则表达式_07


【拓展补充正则表达式】

一些常用术语
? 通配符匹配文件名中的 0 个或 1 个字符,而 * 通配符匹配零个或多个字符;

data的长度和kb ios data_object_l_size_ci_08

^ 为匹配输入字符串的开始位置。

[0-9]+匹配多个数字, [0-9] 匹配单个数字,+ 匹配一个或者多个。

abc$匹配字母 abc 并以 abc 结尾,$ 为匹配输入字符串的结束位置。

语法:

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。

普通字符
  • \s 是匹配所有空白符,包括换行,\S 非空白符,不包括换行。
  • [\s\S] 表示匹配所有
  • \w 表示匹配字母、数字、下划线。
特殊字符
  • $: 匹配输入字符串的结尾位置。
  • * : 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 *。
  • +: 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +。
  • ?: 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 ?。
  • ^: 匹配输入字符串的开始位置

2.2.2 分割

Python split() 通过指定分隔符对字符串进行切片

Q5:以空格分割city
S:

user_info.city.str.split(" ")

data的长度和kb ios data_object_l_size_python_09


分割列表中的元素可以使用 get 或 [] 符号进行访问:

分割后的元素若想获取,可用get或[]进行访问
user_info.city.str.split(" ").str[1]
user_info.city.str.split(" ").str.get(1)

data的长度和kb ios data_object_l_size_data的长度和kb ios_10


设置参数 expand=True 可以轻松扩展此项以返回 DataFrame。

user_info.city.str.split(" ",expand=True)

data的长度和kb ios data_object_l_size_ci_11

小结3:

str属性不仅支持大小写转换等还支持分割&替换;

  • 替换用.str.replace(“old”,“new”);
  • replace还支持正则表达式,熟悉常用的术语:\s\S,\w,.*?,^,$等
  • 分割split()
  • 若想获取分割后的元素,用get或[]获取
  • 想以DF形式返回,则加上expand=True;