Python 筛选特定字符串的数据帧
我正在使用这种数据帧Python 筛选特定字符串的数据帧,python,pandas,dataframe,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
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
我想要实现的结果是:将personone
、personone:
和personone
(最后一个在末尾加空格)。并生产以下产品:
num person cash
0 1 personone 121
1 1 persontwo 81
也就是说,将personone的三个变体组合起来,忽略其所有其他外观。
personone
的cash
是29+17+75=121之和。一个选项是与可选的\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
你的问题并不完全清楚。例如,为什么要删除案例
personone和persontwo
无论如何,一种方法是创建一个标记良好观察结果的标志
变量,例如
df['flag'] = df.person.str.contains('personone:?$')
然后你简单地求和
df.loc[df.flag == True, 'cash'].sum()
您可以使用
^
和$
限制匹配:
>>> 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
在
agg
中使用'sum'
而不是sum
。后者是Python的,没有矢量化。@Quanghaang谢谢!完全忽略了它。