筛选特定字符串的数据帧

2024-05-08 07:15:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用这种数据帧

    num person                  cash
0   1   personone               29
1   1   persontwo               81
2   1   personone:              17
3   1   personone               75
4   1   personone and persontwo 62
5   1   personone's friend      55

我使用以下代码根据字符串向量过滤数据帧

people = ["personone", "persontwo"] 
pattern = r"\b{}\b".format("|".join(people))

df[df["person"].str.match(pattern)]

问题是代码产生的内容比我需要的要多。当我检查df["person"].unique()时,它会给我一个数组:

array(["personone", "persontwo", "personone:", "personone ", "personone and persontwo", "personone's friend"], dtype=object) 

尽管我使用了单词bounders\b

我想要实现的结果是:将persononepersonone:personone 组合起来(最后一个在末尾有空格)。并生产以下产品:

    num person    cash
0   1   personone 121
1   1   persontwo 81

也就是说,将personone的三个变体组合起来,并忽略其所有其他外观。persononecash是29+17+75=121的和


Tags: and数据字符串代码friendformatdfcash
3条回答

你的问题并不完全清楚。例如,为什么要删除案例personone and persontwo

无论如何,一种方法是创建一个flag变量来标记良好的观察结果,例如

df['flag'] = df.person.str.contains('personone:?$')

然后你简单地求和

df.loc[df.flag == True, 'cash'].sum()

一个选项是匹配可选的\W而不是\b,并强制开始和结束字符串:

people = ["personone", "persontwo"] 
pattern = r"^\W?({})\W?$".format("|".join(people))

s = df["person"].str.extract(pattern,expand=False)

df[s.notna()].groupby(['num',s])['cash'].sum()

输出:

num  person   
1    personone    121
     persontwo     81
Name: cash, dtype: int64

您可以使用^$来限制匹配:

>>> people = ["personone", "persontwo"]
>>> patt = fr"^({'|'.join(people)}).?$"
>>> (
      df.groupby(df.person.str.extract(patt, expand=False))
        .agg(cash=('cash', 'sum'), num=('num', 'first'))
        .reset_index().reindex(df.columns, axis=1)
    )
   num     person  cash
0    1  personone   121
1    1  persontwo    81

相关问题 更多 >

    热门问题