过滤特定字符串的数据框

时间:2021-03-02 21:40:32

标签: python pandas dataframe

我正在使用这种数据框。

    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) 

即使我使用了单词边界 \b

我想要实现的结果是:组合 persononepersonone:personone (最后一个以空格结尾)。并产生以下输出:

    num person    cash
0   1   personone 121
1   1   persontwo 81

即结合 personone 的三个变体并忽略其所有其他外观。 cashpersonone 是 29+17+75=121 的总和。

3 个答案:

答案 0 :(得分:1)

一种选择是匹配可选的 \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

答案 1 :(得分:0)

你问的不是很清楚。例如,您为什么要放弃案例 personone and persontwo

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

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

然后你简单地总结

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

答案 2 :(得分:0)

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

$