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

2024-05-15 20:59:01 发布

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

我想找到一种方法,使用类似于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

Tags: 方法dfascodecountriesbrazilperuchile
1条回答
网友
1楼 · 发布于 2024-05-15 20:59:01

似乎您正在寻找带有对象dtype.str扩展pd.Series(基本上您可以调用pd.Series.str....来获取专门用于处理正则表达式和其他基于string的操作的pandas函数子集,但是这仅在数组为数据类型“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

相关问题 更多 >