如何在Pandas DataFrame中获取符合条件的唯一值——以筛选亚马逊相关卖家为例
在Pandas中实现类似SQL LIKE的模糊匹配(获取亚马逊相关卖家的唯一值)
首先,先明确你的场景:你有如下的DataFrame:
import pandas as pd df_amazon = pd.DataFrame ({ 'order_no':[1, 2, 3], 'category':['Books', 'Toys', 'Books'], 'seller':['Amazon.com', 'AZ Toys', 'amazon'] })
你想要获取seller列中所有与亚马逊相关的唯一值,对应SQL里的SELECT seller FROM df_amazon WHERE LOWER(seller) LIKE 'amazon%',但之前的尝试遇到了问题,我来帮你解决。
你之前代码的问题所在
你尝试的df_amazon.seller.str.lower().contains('amazon')报错,是因为str.lower()返回的是一个Series对象,而contains()是Pandas字符串方法,必须通过str访问器调用——你漏掉了第二个str!正确的链式调用应该是df_amazon.seller.str.lower().str.contains('amazon')。
几种正确的实现方式
方式一:修正你的代码,获取唯一值
先通过不区分大小写的匹配筛选出所有亚马逊相关的卖家,再提取唯一值:
# 筛选匹配记录,提取seller列并去重 amazon_sellers = df_amazon.loc[ df_amazon.seller.str.lower().str.contains('amazon'), 'seller' ].unique() print(amazon_sellers) # 输出:array(['Amazon.com', 'amazon'], dtype=object)
方式二:更简洁的忽略大小写匹配(模拟SQL LIKE 'amazon%')
如果要精确匹配以amazon开头的字符串(和你的SQL语句逻辑完全一致),可以用str.startswith(),或者直接给str.contains()加case=False和正则表达式,省去手动转小写的步骤:
# 用startswith实现以amazon开头(不区分大小写) amazon_sellers = df_amazon.loc[ df_amazon.seller.str.lower().str.startswith('amazon'), 'seller' ].unique() # 更简洁:用contains+正则+case=False,直接忽略大小写匹配开头 amazon_sellers = df_amazon.loc[ df_amazon.seller.str.contains(r'^amazon', case=False), 'seller' ].unique()
这里的^amazon是正则表达式,表示以amazon开头,case=False让匹配不区分大小写,完美对应你SQL里的LOWER(seller) LIKE 'amazon%'逻辑。
方式三:保留DataFrame格式的去重结果
如果你需要的是DataFrame格式而不是数组,可以用drop_duplicates()代替unique():
amazon_sellers_df = df_amazon[ df_amazon.seller.str.contains(r'^amazon', case=False) ][['seller']].drop_duplicates()
关键知识点总结
- Pandas的字符串操作必须通过
str访问器调用,链式操作时每个字符串方法都要加上str.前缀 str.contains()支持正则表达式,灵活度很高,case=False参数可以直接实现不区分大小写的匹配- 如果要模拟SQL的
LIKE 'xxx%',用str.startswith()或者正则^xxx会比单纯的contains()更精准,避免匹配到中间包含目标字符串的无关记录
内容的提问来源于stack exchange,提问作者IamWarmduscher
相关产品推荐
相关产品推荐

