【问题标题】:How can I identify a change in a specific column based on the unique identifiers in another column?如何根据另一列中的唯一标识符识别特定列中的更改?
【发布时间】: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


【解决方案1】:

使用DataFrameGroupBy.diff 表示每组的差异,替换第一个缺失值并比较不等于0,然后通过Series.duplicated 获取所有第一行,通过concatboolean indexing 连接在一起,并通过@ 删除重复项987654325@:

mask1 = df.groupby('sec_ID')['code'].diff().fillna(0).ne(0)
mask2 = df['sec_ID'].duplicated()
df = pd.concat([df[mask1], df[~mask2]]).drop_duplicates(['sec_ID']).sort_index()
print (df)
         date sec_ID  code
2  2015-12-18    abc     1
3  2016-01-16    def     0
6  2016-11-17    xyz    -1

【讨论】:

  • 完美运行,谢谢!您能解释一下代码中ne() 的使用吗?谢谢!
  • 它是Series.ne,工作方式类似于!=
猜你喜欢
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多