如何根据另一列中的唯一标识符识别特定列中的更改?
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
这是我的数据框:
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