如何用Pandas Groupby筛选无16位长度CODE的STOCK
筛选所有关联CODE均不为16位的STOCK
原始数据
import pandas as pd data = [['123456ABCD234567', 'A'], ['8502', 'A'], ['74523654894WRZI3', 'B'], ['85CGNK6987541236', 'B'], ['WF85Z4HJ95R4CF2V', 'C'], ['VB52FG85RT74DF96', 'C'], ['WERTZ852146', 'D'], ['APUNGF', 'D'] ] df = pd.DataFrame(data, columns=['CODE', 'STOCK'])
需求:筛选出所有关联的CODE全部都不是16位长度的STOCK(示例中仅STOCK D符合要求)。
解决方案
通过groupby结合字符串长度判断即可实现,以下提供两种可行写法:
写法一:分步实现(逻辑清晰)
# 1. 标记每个CODE是否为16位 df['is_16_len'] = df['CODE'].str.len() == 16 # 2. 分组筛选出没有任何16位CODE的STOCK invalid_stocks = df.groupby('STOCK')['is_16_len'].apply(lambda x: not x.any()).loc[lambda x: x].index # 3. 提取符合条件的行并移除辅助列 result = df[df['STOCK'].isin(invalid_stocks)].drop('is_16_len', axis=1) print(result)
写法二:链式调用(代码简洁)
result = df[df['STOCK'].isin( df.groupby('STOCK')['CODE'] .apply(lambda group: (group.str.len() != 16).all()) .loc[lambda x: x].index )] print(result)
输出结果
CODE STOCK 6 WERTZ852146 D 7 APUNGF D
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

