如何用Pandas内置方法判断水果列是否包含字符串列子串?
问题描述
现有如下DataFrame:
import pandas as pd df = pd.DataFrame(data={'String': list('abcde'), 'Fruit': ['apple', 'pineapple', 'banana', 'orange', 'kiwi']})
初始表格输出:
String Fruit 0 a apple 1 b pineapple 2 c banana 3 d orange 4 e kiwi
需求:判断每个水果名称是否包含String列中的某个字符,期望输出如下格式的结果:
a b c d e Fruit apple True False False False True pineapple True False False False True banana True True False False False orange True False False False True kiwi False False False False False
目前用Python循环实现了需求,但数据量大时效率很低:
df_new = pd.DataFrame() for i in range(len(df)): df_new.loc[:, df.String[i]] = df.Fruit.str.contains(df.String[i]) df_new.set_index(df.Fruit)
问:能不能用Pandas内置方法高效实现这个需求?
解决方案
可以用Pandas的向量化操作实现,完全避免Python层级的循环,大幅提升性能,代码也更简洁:
高效实现代码
import pandas as pd df = pd.DataFrame(data={'String': list('abcde'), 'Fruit': ['apple', 'pineapple', 'banana', 'orange', 'kiwi']}) # 对每个String列的字符,向量化检查所有Fruit是否包含该字符,转置后设置索引 result = df['String'].apply(lambda s: df['Fruit'].str.contains(s)).T result.index = df['Fruit'] print(result)
代码说明
df['String'].apply(lambda s: df['Fruit'].str.contains(s)):遍历String列的每个字符,用Pandas内置的str.contains向量化检查所有水果名称是否包含该字符,得到一个以字符为行、水果为列的布尔DataFrame.T:转置DataFrame,让水果作为行索引,字符作为列名,匹配期望的输出结构result.index = df['Fruit']:将行标签设置为水果名称,完成最终格式调整
运行后输出的结果和需求完全一致,且因为用了Pandas的向量化字符串操作,处理大数据集时的效率会比Python循环高一个数量级以上。
内容的提问来源于stack exchange,提问作者T C Molenaar
相关产品推荐
相关产品推荐

