python 根据Pandas中的条件保留行

2cmtqfgy  于 2022-11-21  发布在  Python
关注(0)|答案(2)|浏览(236)

我正在寻找一个代码来查找符合条件的行并保留这些行。
在图片示例中,我希望保留amt 1 =〉5且amt 2〈5的所有苹果,还希望保留amt 1 =〉1且amt 2〈5的香蕉(图片中以红色突出显示),列表中还有许多其他水果需要过滤(可能有10种水果)。
image example
目前,我正在单独筛选(即创建过滤掉红色和小苹果的 Dataframe 和过滤掉绿色和大香蕉的另一 Dataframe 并且之后使用concat将 Dataframe 连接在一起)。然而,这个过程需要很长的时间来运行,因为数据集是巨大的。我正在寻找一个更快的方法(就像在 Dataframe 中过滤它一样,而不必创建新的 Dataframe )。我还必须使用列索引而不是列名,因为列名会根据日期而变化。
希望我说的有道理。会很感激任何帮助!

qjp7pelc

qjp7pelc1#

我不太确定我是否理解您的要求,因为我不明白要保留的行的条件是如何制定的。
Dataframe 的query方法可以用来合并多个标准来选择数据:

import pandas as pd

pd.DataFrame([
    ['Apple', 5, 1],
    ['Apple', 4, 2], 
    ['Orange', 3, 3], 
    ['Banana', 2, 4], 
    ['Banana', 1, 5]], 
    columns=['Fruits', 'Amt1', 'Amt2'])

df.query('(Fruits == "Apple" & (Amt1 >= 5 & Amt2 < 5)) | (Fruits == "Banana" & (Amt1 >= 1 & Amt2 < 5))')
aelbi1ox

aelbi1ox2#

您可以按以下方式将filteritertuples结合使用

import pandas as pd
df = pd.DataFrame({"x":[1,2,3,4,5],"y":[10,20,30,40,50]})
def keep(row):
    return row[0] >= 2 and row[1] <= 40
df_filtered = pd.DataFrame(filter(keep,df.itertuples())).set_index("Index")
print(df_filtered)

给出输出

x   y
Index       
2      3  30
3      4  40
4      5  50

说明:keep是函数,它应该返回行True以保留要丢弃行False.itertuples()提供元组的可迭代项,这些元组被馈送到filterfilter选择其中keep计算为True的记录,这些选定行用于创建新DataFrame完成后,我设置索引,使Index与原始DataFrame相对应根据您使用情况,您可以选择不设置索引

相关问题