python - 从 Pandas 中的 Value 中获取 N 行
问题描述
我有一个活动的月销售数字列表。我有一列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()
我在想我可以用or做点什么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)
产生要在 final 显示的行的索引df
。
由于上面生成了一个数组列表,因此您希望np.concatenate
所有这些都拥有一个要保留的索引数组。
df.loc[i[i>=0]]
最后,上面首先过滤所有i
负值(因为python中的负索引有意义)并df.loc[]
检索最终的df。
推荐阅读
- node.js - 运行执行 Powershell 脚本的节点应用程序可执行文件时出错
- python - 在 Numpy 或 Pandas 中分割 Linspace
- python - 将三通道图像转换为单通道图像
- python - 模型类在 Django 中被视为局部变量
- linux - 如何使用 --file=script-file 选项在 sed 命令中输入要搜索和替换的文件
- angular - angular 6 bootstrap 如何在组件模板中将宽度设置为 td 表
- python - Scraper 未提取 url 链接:
- c - 确定用户输入值的数据类型
- python - 从另一个类访问实例变量
- java - 如何从可执行文件加载我的本地主机 java spring boot web 应用程序