Python 相当于 R 的 grepl 和 dplyr 过滤器 [重复]
Posted
技术标签:
【中文标题】Python 相当于 R 的 grepl 和 dplyr 过滤器 [重复]【英文标题】:Python's equivalent to R's grepl and dplyr filter [duplicate] 【发布时间】:2021-02-21 10:06:55 【问题描述】:我想找到一种方法,使用类似于 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
【问题讨论】:
【参考方案1】:似乎您正在寻找带有对象dtype
的pd.Series
的.str
扩展(基本上您可以调用pd.Series.str....
来获取专门用于处理正则表达式和其他string
的pandas 函数子集基于操作 - 但是这仅在数组是 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
一个巧妙的使用方法是使用 .join
函数在您的 list_
变量上将其连接成一个可由正则表达式匹配模式使用的字符串。
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
【讨论】:
以上是关于Python 相当于 R 的 grepl 和 dplyr 过滤器 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
R - 子集 - 基于列值的 grepl 选择排除行 [重复]