基于部分字符串匹配创建新的Pandas DataFrame
解决方案:基于列表中的字符串匹配拆分DataFrame
没问题!这在pandas里完全可以用内置功能实现,我给你两种常用的方法,你可以根据自己的数据规模和需求选择:
方法一:直接用apply筛选(适合中小数据集)
首先假设你的DataFrame结构类似这样(我先造个示例方便演示):
import pandas as pd df = pd.DataFrame({ 'UserID': [101, 102, 103, 104], 'Book': [['International', 'Monthly'], ['Domestic'], ['Subscription', 'Digital'], ['International', 'Subscription']] })
要提取包含目标字符串的行,只需要对Book列使用apply,配合lambda函数检查目标值是否在列表中,再用布尔索引筛选即可:
1. 生成包含International的DataFrame
df_international = df[df['Book'].apply(lambda x: 'International' in x)]
2. 生成包含Domestic的DataFrame
df_domestic = df[df['Book'].apply(lambda x: 'Domestic' in x)]
3. 生成包含Subscription的DataFrame
df_subscription = df[df['Book'].apply(lambda x: 'Subscription' in x)]
这种方法逻辑直观,代码简洁,对于中小规模的数据完全够用。
方法二:用explode拆分后筛选(适合大数据集)
如果你的数据集很大,apply的效率可能不够高,这时候可以先把列表拆分成多行,筛选后再合并回原结构:
# 先将Book列的列表拆分为多行 df_exploded = df.explode('Book') # 筛选出International的行,再按UserID分组还原列表 df_international = df_exploded[df_exploded['Book'] == 'International'].groupby('UserID')['Book'].apply(list).reset_index() # 同理处理Domestic和Subscription df_domestic = df_exploded[df_exploded['Book'] == 'Domestic'].groupby('UserID')['Book'].apply(list).reset_index() df_subscription = df_exploded[df_exploded['Book'] == 'Subscription'].groupby('UserID')['Book'].apply(list).reset_index()
这种方法利用pandas的向量化操作,效率会比apply更高,适合处理百万级以上的数据集。
两种方法都不需要额外安装库,都是pandas的内置功能,你可以根据自己的情况选择~
内容的提问来源于stack exchange,提问作者Warthog1
相关产品推荐
相关产品推荐

