我有一大堆东西,按人和约会时间分类.我想要将DF缩短到购买水果的行数和每人购买水果之前的最多5行数.如果5行中有一行是水果购买,那么我只需要提取上面的行,直到最后一次购买水果.

fruits = ["apple", "banana", "pear"]
  date    pesron  item
10:00      amy    apple
10:01      amy    pear
10:02      amy    ipad       (6 rows above 10:08 banana purchase, so delete)
10:03      amy    headphones
10:04      amy    missing
10:05      amy    laptop
10:06      amy    unknown
10:07      amy    table
10:08      amy    banana   (one of the 5 rows above 10:10 banana purchase is also a fruit so stop here)
10:09      amy    unknown
10:10      amy    banana
...        ben   

预期yields

10:00      amy    apple
10:01      amy    pear
10:03      amy    headphones
10:04      amy    missing
10:05      amy    laptop
10:06      amy    unknown
10:07      amy    table
10:08      amy    banana
10:09      amy    unknown
10:10      amy    banana

我试过了

m1= df.item.isin(fruits)
df.loc[m1, df.iloc[idx-5,:]]

推荐答案

您可以按交换顺序创建帮助组,方法是使用累积总和对行进行索引,然后对原始行以上的5行使用GroupBy.tail:

print (df)
     date pesron        item
0   10:00    amy       apple
1   10:01    amy        pear
2   10:02    amy        ipad
3   10:03    amy  headphones
4   10:04    amy     missing
5   10:05    amy      laptop
6   10:06    amy     unknown
7   10:07    amy       table
8   10:08    amy      banana
9   10:09    amy     unknown
10  10:10    amy         ban <- change row
11  10:09    ben     unknown <- added row

fruits = ["apple", "banana", "pear"]

#swap rows and test for mmbership of list
m = df.iloc[::-1].item.isin(fruits)
#group by column and helper Series by cumulative sum of mask
g = m.groupby([df['pesron'], m.cumsum()])

#remove all rows after last match
mask1 = g.cummax()

#counter of rows per groups
mask2 = g.cumcount().lt(7).iloc[::-1]

#chain masks
df = df[mask1 & mask2]
print (df)
    date pesron        item
0  10:00    amy       apple
1  10:01    amy        pear
2  10:02    amy        ipad
3  10:03    amy  headphones
4  10:04    amy     missing
5  10:05    amy      laptop
6  10:06    amy     unknown
7  10:07    amy       table
8  10:08    amy      banana

Python相关问答推荐

使用Ubuntu、Python和Weasyprint的Docker文件-venv的问题

DuckDB将蜂巢分区插入拼花文件

如何让我的Tkinter应用程序适合整个窗口,无论大小如何?

多处理代码在while循环中不工作

将numpy数组存储在原始二进制文件中

如何使用pandasDataFrames和scipy高度优化相关性计算

将特定列信息移动到当前行下的新行

如何使用matplotlib在Python中使用规范化数据和原始t测试值创建组合热图?

如果值不存在,列表理解返回列表

如何获取TFIDF Transformer中的值?

如何在Django基于类的视图中有效地使用UTE和RST HTIP方法?

Python中绕y轴曲线的旋转

无法在Docker内部运行Python的Matlab SDK模块,但本地没有问题

为什么Django管理页面和我的页面的其他CSS文件和图片都找不到?'

需要帮助重新调整python fill_between与数据点

在嵌套span下的span中擦除信息

在Python 3中,如何让客户端打开一个套接字到服务器,发送一行JSON编码的数据,读回一行JSON编码的数据,然后继续?

LocaleError:模块keras._' tf_keras. keras没有属性__internal_'''

在Python中控制列表中的数据步长

根据Pandas中带条件的两个列的值创建新列