本Task设计知识点:
- DataFrame筛选——文本包含
- 列表的降维——sum()的妙用
- 拼接列表中的字符串——" ".join([列表])
- 把列表/字典转换为DataFrame
1.DataFrame筛选——文本包含
上一篇已经讨论了DataFrame筛选的query函数,可以筛选出大于、小于、等于,或者给出一个列表,选出value在其中的数据行。
然而,对于筛选value中包含 “某某字符串”的情况,query函数也不能解决。
此时,可以使用以下的方法:
data2 = data[data["姓名"].apply(lambda x: "张" in x)]
这条语句,就可以把姓名中含有“张”字的人筛选出来了。
技巧就是使用.apply(lambda x: 返回布尔值的函数)
这种方式更加通用,不但可以用来处理简单的大小比较,文本包含,也可以结合正则表达式,筛选出符合某些特定规则的数据。
使用re.match(表达式,字符串)函数,如果符合,则返回match对象,如果不符合,则返回None。只需要在后面加上 is not None,就可以变成布尔型的返回值。
string = "我是大坏蛋"
match_result = re.match(".*大.*",string) is not None
print(match_result)
>>>True
print(type(match_result))
>>> <class 'bool'>
结合正则表达式、lambda匿名函数的筛选方法,可以写成:
data3 = data[data["姓名"].apply(lambda x: re.match(".*张.*",x) is not None)]
通过正则表达式,可以将其拓展为“叫张XX的”、“叫张X明的”等筛选条件。
2. 列表的降维——sum()的妙用
参考文章:https://blog.csdn.net/chinesehuazhou2/article/details/89367571
面对的问题场景:
oldlist = [[1, 2, 3], [4, 5]]
# 想得到结果:
newlist = [1, 2, 3, 4, 5]
方法一,粗暴拼接法:
newlist = oldlist[0] + oldlist[1]
方法二,列表推导式:
列表推导式的双层嵌套,在前一篇博客中的第三点已经讨论了。
newlist = [i for j in range(len(oldlist)) for i in oldlist[j]]
方法三,巧用sum:
newlist = sum(oldlist,[])
语法: sum(iterable[, start])
,sum() 函数的第一个参数是可迭代对象,如列表、元组或集合等,第二个参数是起始值,默认为 0 。其用途是以 start 值为基础,再与可迭代对象的所有元素相“加”。
在上例中,执行效果是 oldlist 中的子列表逐一与第二个参数相加,而列表的加法相当于 extend 操作,所以最终结果是由 [] 扩充成的列表。
这里有两个关键点:sum() 函数允许带两个参数,且第二个参数才是起点。 可能 sum() 函数用于数值求和比较多,然而用于作列表的求和,就有奇效。它比列表推导式更加优雅简洁!
另外,第二个参数不能用字符串,会报错,因为如果要拼接字符串,使用.join()更快,所以限制了sum字符串的使用。
3. 拼接列表中的字符串——" ".join([列表])
' '.join(["张三","李四","王五"])
>>> '张三 李四 王五'
4. 把列表/字典转换为DataFrame
pd.DataFrame( 数据,index=,columns= )
pd.DataFrame()里面的参数index和columns是可选的,一般是列表,而数据可以是多种形式。
- 如果是单个元素的列表,就会转为仅有一列的DataFrame;
- 如果是列表的列表,即[[列表],[列表],[列表]],就转化为二维表。列名需要通过columns参数指定。
- 如果是字典的列表,即 [{字典},{字典},{字典}],也是转换为二维表。字典里面的key就是列名。
- 如果数据就是一个字典,而字典中的value是列表,如{“name”:[列表],"age":[列表]},也可以转换为二维DataFrame,与前一种是相同的。