python - 从 Pandas 的值中获取 N 行

标签 python pandas dataframe

我有一份事件的每月销售数字列表。我有一列 Event_Ind 指示那个月是否有事件。我需要在每个事件之前获得 3 个值(含)。允许值重叠。

import pandas as pd
dates = pd.date_range(start='2019-01-01', end='2020-01-01', freq='M')
values = [1000,1067,1099,1100,2000,1000,1057,1082,1200,1300,1453,1500]
event_ind = ["*","","","","*","","","","*","","*",""]
df = pd.DataFrame({'Dates':dates, 'Values':values, 'Event_Ind':event_ind})


        Dates  Values Event_Ind
0  2019-01-31    1000         *
1  2019-02-28    1067          
2  2019-03-31    1099          
3  2019-04-30    1100          
4  2019-05-31    2000         *
5  2019-06-30    1000          
6  2019-07-31    1057          
7  2019-08-31    1082          
8  2019-09-30    1200         *
9  2019-10-31    1300          
10 2019-11-30    1453         *
11 2019-12-31    1500         

此示例数据的目标是:

    Dates   Values  Event_Ind
0   1/31/2019   1000    *
1   3/31/2019   1099    
2   4/30/2019   1100    
3   5/31/2019   2000    *
4   7/31/2019   1057    
5   8/31/2019   1082    
6   9/30/2019   1200    *
7   9/30/2019   1200    *
8   10/31/2019  1300    
9   11/30/2019  1453    *

我想我可以用 shift() 做点什么或 groupby.tail() .但我似乎无法使用它们来获得我想要的输出

最佳答案

您可以按照以下方式进行操作:

s = df.Event_Ind.eq('*')
i = np.concatenate([np.arange(a,b+1) for b,a in zip(s[s].index, s[s].index - 2)])

df.loc[i[i>=0]]

        Dates  Values Event_Ind
0  2019-01-31    1000         *
1  2019-02-28    1067          
2  2019-03-31    1099          
3  2019-04-30    1100          
4  2019-05-31    2000         *
5  2019-06-30    1000          
6  2019-07-31    1057          
7  2019-08-31    1082          
8  2019-09-30    1200         *
7  2019-08-31    1082          
8  2019-09-30    1200         *
9  2019-10-31    1300          
10 2019-11-30    1453         *

解释

[np.arange(a,b+1) for b,a in zip(s[s].index, s[s].index - 2)]

上面的代码zip* 索引值,索引在上面两行。因此,np.arange(a,b+1) 生成您要在最终 df 中显示的行的索引。

由于上面生成了一个数组列表,您需要np.concatenate所有这些以保留一个索引数组。

df.loc[i[i>=0]]

最后,上面的代码首先过滤了i中的所有负数(因为python中的负数索引是有意义的)和df.loc[]来检索最终 df.

关于python - 从 Pandas 的值中获取 N 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58493757/

相关文章:

python - 如何使用 Pandas 只读取 excel 标题?

python - 我可以在 Jython 中使用 from __future__ 导入排序吗?

Python - 快速删除此列表中的重复项的方法?

python - 如何获取特定标签之前/之前的 n 个索引号?

python - 防止 numpy select 在 "choicelist"和 "default"参数中转换值

Python pandas 时间序列,具有分层索引和滚动/移位

python - 数据框列的平均值

python - 列表追加内存错误

python - 高效统计 NumPy 中唯一子数组的出现次数?

python - 使用 pandas 在 Python 中计算新列