簡體   English   中英

如何搜索 python pandas 中的一列列表並返回列表中的項目以及另一列的值?

[英]How do I search through a column of lists in python pandas and return the item in the list as well as the value from another column?

我制作了一個 pandas 數據框,其中有兩個主要列,一個是作業名稱,另一個是 SQL 腳本。

我需要提取以“_REP”結尾的表,我已將腳本拆分為單詞列表(注意 csv 最初沒有用於腳本的逗號)並且需要返回 EXCTRATION 和具有 ' _REP' 最后,如果沒有 _REP 表,它應該返回 noRepTable 或其他表示沒有 _REP 的東西。 結果也需要是 csv。


df = pd.read_csv("requests.csv")
df["sql_split"]= df["sql"].str.split(" ")

EXTRACTION  ...                                          sql_split
0  AU01     ...  [SELECT, COLUMN1, AS, CONNECTION_ID, FROM, TABLE_REP]
1  AU04     ...  [SELECT, COLUMN2, AS, EVENT_ACTION, FROM, TABLE2_REP]
2  AU05     ...  [SELECT, COLUMN1, AS, ID, FROM, TABLE_DB]


expected result:

AU01,TABLE_REP
AU04,TABLE2_REP
AU05,noRepTable


使用Series.str.extractdf.fillna

In [1708]: df['final'] = df['sql'].str.extract(r'(\w*_REP)').fillna('noRepTable')

In [1711]: df
Out[1711]: 
  EXTRACTION       final
0       AU01   TABLE_REP
1       AU04  TABLE2_REP
2       AU05  noRepTable

我注意到您想要提取表名,它在 SQL 中出現在“FROM”之后。 所以對於每一行,我的想法是:

  • sql_split中找到“FROM”元素,
  • 獲取表名(下一個元素),
  • 返回表名(如果它以“_REP”結尾)或“noRepTable”,以及EXTRACTION屬性。

為此,定義一個 function 應用於每一行:

def myConv(row):
    tbl = row.sql_split
    ind = tbl.index('FROM')
    tblName = tbl[ind + 1]
    return row.EXTRACTION, tblName if tblName.endswith('_REP') else 'noRepTable'

然后應用它:

result = df.apply(myConv, axis=1, result_type='expand')

結果是:

      0           1
0  AU01   TABLE_REP
1  AU04  TABLE2_REP
2  AU05  noRepTable

到目前為止,列名是連續的數字,但如果您願意,可以按您希望的方式重命名它們。

注意:我假設每個源行都包含一個以“_REP”結尾的表名。 如果你的情況比較復雜,你應該 state 正是所有這些細節。

您可以嘗試使用正則表達式搜索 function 來查找特定模式,而不是拆分“”字符並使用它來獲取“_REP”。

您的正則表達式將嘗試查找以空格開頭(模式中的[ ] )、中間有一些非空格字符(模式中的[A-Z0-9]+ )並以一個“_REP”(模式中的(_REP) )。 此模式也應位於 SQL 查詢的末尾,因此$位於末尾。 您可以從表達式中刪除它,如果表名可以位於 SQL 查詢的中間,則添加另一個[ ]標記。

它看起來像這樣:

import re

pattern = r"[ ][A-Z0-9]+(_REP)$" # this is the pattern you're looking for

# Get an object that matches what you're looking for or gives you a None
df["rep_checks"]= df["sql"].apply(lambda x: re.search(pattern, x)) 

# Extract the useful table name and remove unnecessary spaces, or insert "noRepTable"
df["rep_checks"] = df["rep_checks"].apply(lambda x: x.group().strip() is x is not None else 'noRepTable') 

也可以查看有關re.search的具體文檔!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM