2016-08-04 70 views
1
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)] 

我怎樣才能使它更通用,即我想有一個函數,在那裏我指定列名和我正在尋找的值作爲參數。

回答

3

一選項將使用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 
+0

謝謝@root,如果您的解決方案不是數字,而是字符串比較,您的解決方案是否工作? – user308827

+1

是的,但不是很直接。查詢字符串需要在其中引用:「'== ==」是「&B == 4''。爲了得到這個,你需要在你的字符串中引用引號,例如在引用你的字符串的單引號內的雙引號,反之亦然:'('A','==',''yes''')'。 – root

+1

或者,你可以在你的函數中實現一個檢查來確定你是否與一個字符串進行比較,如果是這樣,那麼格式化你的查詢的方式略有不同:''{} {}「{}」'。format(* c)' 。 – root

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 
+0

請讓我知道了什麼是問題downvoting之前! –

+0

@GuaravDhama我看不到問題。在我看來,反對票是不合理的。從我+1。 – piRSquared

2

指定你正在尋找的一系列什麼

# first row of df1 
looking_for = df1.iloc[0, :] 

然後評估平等並找到所有的都在一個平等的行。

df1.eq(looking_for).all(1) 

0  True 
1 False 
2 False 
3 False 
dtype: bool 

使用此作爲過濾器

df1[df1.eq(looking_for).all(1)] 

enter image description here

一般地,指定任意系列

looking_for = pd.Series([1, 5, 7], list('BAC')) 

df1[df1.eq(looking_for).all(1)] 

enter image description here