我有一个如下数据框:
ID1 ID2 Date
1 2 01/01/2018
1 2 03/01/2018
1 2 04/05/2018
2 1 06/06/2018
1 2 08/06/2018
3 4 09/07/2018
等
我需要做的是标记ID1中的ID第一次出现在ID2中。在上面的示例中,这看起来像
ID1 ID2 Date Flag
1 2 01/01/2018
1 2 03/01/2018
1 2 04/05/2018
2 1 06/06/2018
1 2 08/06/2018 Y
3 4 09/07/2018
我已经使用以下代码告诉我ID1是否曾经出现在ID2中:
ID2List= df['ID2'].tolist()
ID2List= list(set(IDList)) # dedupe list
df['ID1 is in ID2List'] = np.where(df[ID1].isin(ID2List), 'Yes', 'No')
但这只是告诉我,有时在某些情况下ID1出现在ID2中,而在第一次发生的情况中则没有。
有帮助吗?
答案 0 :(得分:1)
一个想法是将next
与生成器表达式一起使用来计算ID1
中的匹配索引。然后与索引进行比较,并使用argmax
获取第一个True
值的索引:
idx = df.apply(lambda row: next((idx for idx, val in enumerate(df['ID1']) \
if row['ID2'] == val), 0), axis=1)
df.loc[(df.index > idx).argmax(), 'Flag'] = 'Y'
print(df)
ID1 ID2 Date Flag
0 1 2 01/01/2018 NaN
1 1 2 03/01/2018 NaN
2 1 2 04/05/2018 NaN
3 2 1 06/06/2018 Y
4 1 2 08/06/2018 NaN
5 3 4 09/07/2018 NaN