编写python函数以从pandas数据帧中提取匹配的行

时间:2016-08-04 17:35:59

标签: python pandas dataframe

df1 = pd.DataFrame({'A' : [5,5,5,5], 'B' : [4,2,1, 1], 'C' : [2,2,7,1]})

我想根据foll在df1中获取这些行。条件:

df1.loc[(df1['A'] == 5) & (df1['B'] == 4) & (df1['C'] == 2)]

如何使它更通用,即我想要一个函数,我在其中指定列名和我正在寻找的值作为参数。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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