Python相当于R的grepl和dplyr过滤器



我想找到一种方法,使用类似于dplyr包的东西在Python中从R重新创建相同的命令代码。在R中,我会这样做:

library(dplyr)
df <- data.frame(Countries=c('Brazil','Venezuela','Brazil, Colombia, Paraguay','Argentina','Peru','Andorra,Argentina,Chile,Uruguay'),
Code=c(1,2,3,4,5,6))
df  %>% filter(grepl('(Brazil|Argentina)',Countries))

甚至:

a=strsplit(as.character(df$Countries),',')
a=lapply(a,FUN=function(t) gsub(" ","",t))
ele=unlist(lapply(a,FUN=function(t) any(t%in%c('Brazil','Argentina'))))
(df[ele,])

我想要的输出:

Countries Code
1                     Brazil    1
2 Brazil, Colombia, Paraguay    3
3                  Argentina    4
4    Argentina,Chile,Uruguay    6

在Python中,我尝试过:

import pandas as pd
df = pd.DataFrame(dict(Countries=['Brazil','Venezuela','Brazil, Colombia, Paraguay','Argentina','Peru','Andorra,Argentina,Chile,Uruguay'], Code=[1,2,3,4,5,6]))
list_=['Brazil','Argentina']
print(df.loc[df['Countries'].isin(list_)])

但输出看起来像:

Countries  Code
0     Brazil     1
3  Argentina     4

看起来您正在寻找具有对象dtypepd.Series.str扩展(本质上,您可以为panda函数的子集调用pd.Series.str....,专门用于处理正则表达式和其他基于string的操作-但是,这仅在数组为dtype"object"时有效。

mask = df["Countries"].str.contains("Brazil|Argentina")
subset = df.loc[mask]
print(subset)
Countries  Code
0                           Brazil     1
2       Brazil, Colombia, Paraguay     3
3                        Argentina     4
5  Andorra,Argentina,Chile,Uruguay     6

使用它的一种巧妙方法是,在list_变量上使用.join函数,将其连接到正则表达式匹配模式可用的单个字符串中。

list_=['Brazil','Argentina']
pattern = "|".join(list_) # Now we have "Brazil|Argentina" as a string
mask = df["Countries"].str.contains(pattern)
subset = df.loc[mask] # Same subset as the previous example

参见文档中除.str.contains之外的文档和其他方法https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.html

最新更新