我正在使用这种数据框。
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
。
我想要实现的结果是:组合 personone
、personone:
和 personone
(最后一个以空格结尾)。并产生以下输出:
num person cash
0 1 personone 121
1 1 persontwo 81
即结合 personone
的三个变体并忽略其所有其他外观。 cash
的 personone
是 29+17+75=121 的总和。
答案 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
和 ^
来限制匹配:
$