df1 = pd.DataFrame({'A' : [5,5,5,5], 'B' : [4,2,1, 1], 'C' : [2,2,7,1]})
我想根據foll獲取df1中的那些行。條件:編寫python函數以從熊貓數據框中提取匹配行
df1.loc[(df1['A'] == 5) & (df1['B'] == 4) & (df1['C'] == 2)]
我怎樣才能使它更通用,即我想有一個函數,在那裏我指定列名和我正在尋找的值作爲參數。
df1 = pd.DataFrame({'A' : [5,5,5,5], 'B' : [4,2,1, 1], 'C' : [2,2,7,1]})
我想根據foll獲取df1中的那些行。條件:編寫python函數以從熊貓數據框中提取匹配行
df1.loc[(df1['A'] == 5) & (df1['B'] == 4) & (df1['C'] == 2)]
我怎樣才能使它更通用,即我想有一個函數,在那裏我指定列名和我正在尋找的值作爲參數。
一選項將使用query
。對於你的問題的條件,這將涉及構建一個字符串沿'A==5 & B==4 & C==2'
線。
爲了解決這個問題,我假定您提供了一個元組列表,例如(column, comparison, value)
作爲您的條件,例如('A', '==', 5)
。
然後,你可以寫的線沿線的一個功能:
def extract_matching_rows(df, conditions):
conditions = ' & '.join(['{}{}{}'.format(*c) for c in conditions])
return df.query(conditions)
如果你只關心相等比較,在'=='
你可以只硬編碼,並從你的病情元組消除它。
用法示例略有不同的條件:
conditions = [('A', '>=', 5), ('B', '==', 4), ('C', '<', 3)]
extract_matching_rows(df1, conditions)
A B C
0 5 4 2
請注意,你甚至可以query
比較列:
conditions = [('B', '>=', 'C'), ('A', '==', 5)]
extract_matching_rows(df1, conditions)
A B C
0 5 4 2
1 5 2 2
3 5 1 1
你需要這樣的事情,filterdf是你的函數:
import pandas as pd
df1 = pd.DataFrame({'A' : [5,5,5,5], 'B' : [4,2,1,1], 'C' : [2,2,7,1]})
def filterdf(df,col1,col2,val1,val2):
return df[(df[col1] == val1) & (df[col2] == val2)]
df2 = filterdf(df1,'A','B',5,4)
print(df2)
Out:
A B C
0 5 4 2
請讓我知道了什麼是問題downvoting之前! –
@GuaravDhama我看不到問題。在我看來,反對票是不合理的。從我+1。 – piRSquared
謝謝@root,如果您的解決方案不是數字,而是字符串比較,您的解決方案是否工作? – user308827
是的,但不是很直接。查詢字符串需要在其中引用:「'== ==」是「&B == 4''。爲了得到這個,你需要在你的字符串中引用引號,例如在引用你的字符串的單引號內的雙引號,反之亦然:'('A','==',''yes''')'。 – root
或者,你可以在你的函數中實現一個檢查來確定你是否與一個字符串進行比較,如果是這樣,那麼格式化你的查詢的方式略有不同:''{} {}「{}」'。format(* c)' 。 – root