【发布时间】:2020-12-09 08:50:39
【问题描述】:
这是我的数据框:
| date | sec_ID | code |
|---|---|---|
| 2015-11-16 | abc | 0 |
| 2015-11-17 | abc | 0 |
| 2015-12-18 | abc | 1 |
| 2016-01-16 | def | 0 |
| 2016-02-16 | def | 0 |
| 2015-11-16 | xyz | 0 |
| 2016-11-17 | xyz | -1 |
数据框包含近 400 万行,用于 3000 种证券(3000 个唯一 SEC_ID)。这是一个基于时间序列的数据,因为我们在单独的列中为每种证券的每一天都有一个代码。
我想要的是遍历每个 SEC_ID,并检测特定 SEC_ID 的代码更改的第一个日期,只保留该行,或者如果代码始终为 0,则检测证券的第一个日期。为每个 SEC_ID 重置迭代器很重要。
因此,所需的输出将是一个包含 3000 行的数据集,每种情况下为 1、0 或 -1,如下所示:
| date | sec_ID | code |
|---|---|---|
| 2015-12-18 | abc | 1 |
| 2016-01-16 | def | 0 |
| 2016-11-17 | xyz | -1 |
我已经按照安全 ID 和日期升序对数据进行了排序。
到目前为止,我已经尝试过:
data['diff'] = data['code'].diff()
data.dropna(inplace=True) # did this because the first row was understandably a NaN. No other NaNs anywhere in the dataset.
data_first_change = data.loc[data['diff'] != 0]
data_first_change = data_first_change.groupby('sec_ID').nth(0).reset_index()
上面没有产生所需的输出,因为代码不会为每个 sec_ID 重置。
有什么想法吗?
【问题讨论】:
-
另外,预期输出似乎与输入样本数据不匹配,是否可以更改它们?
-
我没有发布任何图片,所以无法理解您的第一条评论。我不清楚你的第二条评论,你能澄清一下吗?预期输出与输入样本数据一致 - 请问究竟有什么不清楚的地方?
-
哎呀,它看起来像图片,对不起。
-
现在超级棒。
标签: pandas loops time-series sequential