如何根据另一列中的唯一标识符识别特定列中的更改?

How can I identify a change in a specific column based on the unique identifiers in another column?

这是我的数据框:

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_IDs)。这是一个基于时间序列的数据,因为我们在单独的列中为每种证券的每一天都有一个代码。

我想要的是遍历每个 SEC_ID,并检测特定 SEC_ID 的 CODE 更改的第一个日期,只保留该行,或者证券的第一个日期,如果代码始终为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_IDs.

重置

有什么想法吗?

使用DataFrameGroupBy.diff for difference per groups, replace first missing values and compare for not equal 0, then get all first rows by Series.duplicated, join together by concat with boolean indexing and remove duplicates by DataFrame.drop_duplicates:

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