[英]How can I iterate through a column of a pandas DataFrame and return value from another column?
[英]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.extract
和df.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”之后。 所以對於每一行,我的想法是:
為此,定義一個 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.