我只想保留序列的第一个实例的值,后面的值要设置为零。如果该值在系列中稍后再次重复,则也应捕获它。 例如 -265.95745849609375 存在于顶部和底部
*
s1
Index value
847.7248427790372 -265.95745849609375
847.7448445792772 -265.95745849609375
847.8448535804773 -265.95745849609375
847.8648553807175 -480.0611789817236
847.8848571809574 -714.2857666015625
848.0048679823976 -714.2857666015625
848.0248697826377 -714.2857666015625
.... .....
849.0449615948793 -714.2857666015625
849.0649633951193 -550.6575933264419
849.0849651953594 -446.4285583496094
849.1849741965596 -446.4285583496094
... ...
849.2449795972797 -446.4285583496094
849.8650354047206 -248.9522315559211
849.8850372049607 -265.95745849609375
849.9050390052007 -265.95745849609375
849.9250408054407 -265.95745849609375
*
预期结果:
*
847.7248427790372 -265.95745849609375
847.7448445792772 0
847.7648463795173 0
847.8648553807175 -480.0611789817236
847.8848571809574 -714.2857666015625
847.9048589811974 0
847.9248607814375 0
848.0248697826377 0
.... .....
849.0449615948793 0
849.0649633951193 -550.6575933264419
849.0849651953594 -446.4285583496094
849.1049669955994 0
849.1249687958394 0
849.1849741965596 0
... ...
849.2449795972797 0
849.8650354047206 -248.9522315559211
849.8850372049607 -265.95745849609375
849.9050390052007 0
849.9250408054407 0
我使用的代码
for outer in range(1,len(s1['value'])-1):
if s1['value'].values[outer] == s1['value'].values[outer+1]:
for inner in range(outer,len(s1['value'])):
if s1['value'].values[outer] == s1['value'].values[inner]:
s1['value'].values[inner] = 0
outer=inner+1
但执行此操作需要更长的时间,因为系列中的元素数量通常为 30000 及以上。 任何人都可以帮助提供更好更快的方法来做到这一点吗? 提前致谢。
答案 0 :(得分:0)
您可以使用 series.duplicated
查找重复项,然后使用 np.where
或 series.mask
将其设置为 0:
df['value'] = np.where(df['value'].duplicated(),0,df['value'])
这会将所有重复项标记为 0。但是,如果您想在系列中稍后出现重复项而不是立即重复项时重新开始,您可以这样做:
df['value'] = np.where(df['value'].eq(df['value'].shift()),0,df['value'])
print(df)
Index value
0 847.724843 -265.957458
1 847.744845 0.000000
2 847.844854 0.000000
3 847.864855 -480.061179
4 847.884857 -714.285767
5 848.004868 0.000000
6 848.024870 0.000000
7 849.044962 0.000000
8 849.064963 -550.657593
9 849.084965 -446.428558
10 849.184974 0.000000
11 849.244980 0.000000
12 849.865035 -248.952232
13 849.885037 -265.957458
14 849.905039 0.000000
15 849.925041 0.000000