亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

更簡單的 Python 等效于 R 風格的 grep,包括多個要匹配的內容

更簡單的 Python 等效于 R 風格的 grep,包括多個要匹配的內容

30秒到達戰場 2021-11-09 15:39:33
這個問題是一個近乎重復的這一個,有一些調整。獲取以下數據框,并獲取其中包含“sch”或“oa”的列的位置。在 R 中足夠簡單:df <- data.frame(cheese = rnorm(10),                 goats = rnorm(10),                  boats = rnorm(10),                  schmoats = rnorm(10),                  schlomo = rnorm(10),                 cows = rnorm(10))grep("oa|sch", colnames(df))[1] 2 3 4 5write.csv(df, file = "df.csv")現在在 python 中,我可以使用一些詳細的列表理解:import pandas as pddf = pd.read_csv("df.csv", index_col = 0)matches = [i for i in range(len(df.columns)) if "oa" in df.columns[i] or "sch" in df.columns[i]]matchesOut[10]: [1, 2, 3, 4]我想知道在 python 中是否有比上面的列表理解示例更好的方法。具體來說,如果我有幾十個字符串要匹配怎么辦。在 R 中,我可以做類似的事情regex <- paste(vector_of_strings, sep = "|")grep(regex, colnames(df))但是如何在 python 中使用列表理解來做到這一點并不明顯。也許我可以使用字符串操作以編程方式創建將在列表內執行的字符串,以處理所有重復的or語句?
查看完整描述

2 回答

?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

使用 pandas 的DataFrame.filter運行相同的正則表達式:


df.filter(regex = "oa|sch").columns

# Index(['goats', 'boats', 'schmoats', 'schlomo'], dtype='object')


df.filter(regex = "oa|sch").columns.values

# ['goats' 'boats' 'schmoats' 'schlomo']

數據


import numpy as np

import pandas as pd


np.random.seed(21419)


df = pd.DataFrame({'cheese': np.random.randn(10),

                   'goats': np.random.randn(10), 

                   'boats': np.random.randn(10), 

                   'schmoats': np.random.randn(10), 

                   'schlomo': np.random.randn(10),

                   'cows': np.random.randn(10)})

并且要搜索多個字符串:


rgx = "|".join(list_of_strings)


df.filter(regex = rgx)

要返回索引,請考慮來自@Divakar 的矢量化 numpy 解決方案。請注意,與 R 不同,Python 是零索引的。


def column_index(df, query_cols):

    cols = df.columns.values

    sidx = np.argsort(cols)

    return sidx[np.searchsorted(cols,query_cols,sorter=sidx)]


column_index(df, df.filter(regex="oa|sch").columns)

# [1 2 3 4] 


查看完整回答
反對 回復 2021-11-09
?
慕田峪4524236

TA貢獻1875條經驗 獲得超5個贊

也許您正在尋找re模塊?


import re

pattern = re.compile("oa|sch")

[i for i in range(len(df.columns)) if pattern.search(df.columns[i])]

# [1, 2, 3, 4]

與 R 的矢量化相比,可能不是最好的,但列表理解應該沒問題。


如果你想將字符串連接在一起,你可以做類似的事情


"|".join(("oa", "sch"))

# 'oa|sch'


查看完整回答
反對 回復 2021-11-09
  • 2 回答
  • 0 關注
  • 410 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號