Python数据分析学习笔记:字符串统计

一、题目来源

Kaggle Pandas - Exercise: Summary Functions and Maps 章节

二、题目要求

描述一瓶葡萄酒时,可用的词汇有限。哪种词出现频率更高:“tropical” 还是 “fruity”?
统计 description 列中这两个词的出现次数。忽略大小写。

三、我的思路(使用 str.contains统计总次数)

tropical_count = reviews['description'].str.contains('tropical',case=False).sum()
fruity_count = reviews['description'].str.contains('fruity',case=False).sum()
descriptor_counts = pd.Series({"tropical": tropical_count, "fruity": fruity_count})

考虑使用 str.contains() 去判断字符串中是否包含 tropical 与 fruity,case=False 用于忽略大小写。

最后得到的结果是:

tropical    3800
fruity      9455
dtype: int64

答案是错误的。
我尝试另外一种方法:

tropical_count = reviews['description'].str.count('tropical').sum()
fruity_count = reviews['description'].str.count('fruity').sum()

这种方法结果是:

tropical    3703
fruity      9259
dtype: int64

kaggle答案是:

n_trop = reviews.description.map(lambda desc: "tropical" in desc).sum()
n_fruity = reviews.description.map(lambda desc: "fruity" in desc).sum()
descriptor_counts = pd.Series([n_trop, n_fruity], index=['tropical', 'fruity'])

结果是正确的。

tropical    3607
fruity      9090
dtype: int64

以数据 [ “tropical and tropical” , “xxxx” , “Subtropical” ], 匹配tropical 字符串为例子:

(1)str.contains() 方法:
用途:统计每一行中是否“包含”子字符串 tropical;

返回:布尔值(True 或 False);

每一列独立判断,即使该列包含多次 tropical,也只算一次。
	Series([
    True,   # "tropical and tropical" -> 包含
    False,  # "xxxx" -> 不包含
    True    # "Subtropical" -> 包含 "tropical" 作为子字符串])

经过sum()计算后结果为2;

(2)str.count() 方法:
用途:统计每一行中 tropical 出现的“总次数”;

返回:整数(如 2, 0, 1);

每一行中出现多少次,就统计多少次;
Series([
    2,  # "tropical and tropical" 中出现了2次
    0,  # "xxxx"
    1   # "Subtropical" 中出现一次(包含 tropical)
])

最终 .sum() 后结果为 3

(3)map(lambda desc: ‘tropical’ in desc) 方法:
用途:统计每一行中 tropical 出现的“总次数”,严格子串匹配
	Series([
    True,   # "tropical and tropical" -> 包含
    False,  # "xxxx" -> 不包含
    False# "Subtropical" -> 严格子串匹配("Subtropical" 不计))

因此sum()后结果为1


方法 用途 匹配规则 示例输入 示例输出 sum() 结果
str.contains("tropical") 检查是否包含子串 大小写敏感,每行算一次 ["tropical and tropical", "xxxx", "Subtropical"] [True, False, False] 1
str.contains("tropical", case=False) 检查是否包含子串(不区分大小写) 大小写不敏感,每行算一次 同上 [True, False, True] 2
str.count("tropical") 统计子串出现次数 大小写敏感,统计所有次数 同上 [2, 0, 0] 2
str.count("tropical", case=False) 统计子串出现次数(不区分大小写) 大小写不敏感,统计所有次数 同上 [2, 0, 1] 3
map(lambda x: "tropical" in x) 检查是否包含子串(严格匹配) 大小写敏感,每行算一次 同上 [True, False, False] 1

str.contains():只判断是否包含,不计数,默认大小写敏感。如果需要不区分大小写的匹配,加 case=False

str.count():统计子串出现次数,默认大小写敏感。

map(lambda x: “tropical” in x):等同于 str.contains() 的严格匹配版本(大小写敏感)。

你可能感兴趣的:(python,pandas,字符串匹配,python,数据分析,学习)