熊猫数据帧中重复序列的第一个元素

时间:2021-02-02 15:34:49

标签: python pandas

我只想保留序列的第一个实例的值,后面的值要设置为零。如果该值在系列中稍后再次重复,则也应捕获它。 例如 -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 及以上。 任何人都可以帮助提供更好更快的方法来做到这一点吗? 提前致谢。

1 个答案:

答案 0 :(得分:0)

您可以使用 series.duplicated 查找重复项,然后使用 np.whereseries.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