首页 > 解决方案 > 按子字符串条件对数据帧进行排序,不包括相似的字符串

问题描述

我有一个名为'tag'的字符串类型列的数据框,

标签有三个类别(data_types):

df['tag']
data_types=['DATA','DATAKIND','DATAKINDSIM']

如果我想计算 'tag' 列中每个 data_type 的行数,我以这种方式应用字符串包含条件

for data in data_types:
    df[dtype.tag.str.contains(data_type,na=False)].count()

但是,显然,标记“DATA”的计数包括真正的“DATA”行以及会计中的“DATAKIND”和“DATAKINDSIM”;'DATAKIND' 和 'DATAKINDSIM' 相同。如何排除“DATA”会计列中的类似字符串?

这是一个可重现的例子:


d = {'tag': ['DATA', 'DATAKIND','DATA','DATA','DATAKINDSIM','DATAKIND']}

df = pd.DataFrame(data=d)


data_types=['DATA','DATAKIND','DATAKINDSIM']

for data_type in data_types:
    print(data_type)
    counting=df[df.tag.str.contains(data_type,na=False)].count()
    print(counting)

和输出:

DATA
tag    6
dtype: int64
DATAKIND
tag    3
dtype: int64
DATAKINDSIM
tag    1
dtype: int64

这将是预期的输出,考虑到执行的会计排除了类似的字符串,只计算了具体的字符串匹配,

预期输出,

DATA
tag    3
dtype: int64
DATAKIND
tag    2
dtype: int64
DATAKINDSIM
tag    1
dtype: int64

标签: pythonpandasdataframe

解决方案


如果我理解正确,您可以使用isin先过滤tag列然后使用groupby.size

data_types=['DATA','DATAKIND','DATAKINDSIM']
df[df['tag'].isin(data_types)].groupby('tag')['tag'].size()

tag
DATA           3
DATAKIND       2
DATAKINDSIM    1
Name: tag, dtype: int64

推荐阅读