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)]
如何使它更通用,即我想要一个函数,我在其中指定列名和我正在寻找的值作为参数。
答案 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)]
通常,指定任何系列
looking_for = pd.Series([1, 5, 7], list('BAC'))
df1[df1.eq(looking_for).all(1)]
答案 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