Comme vous pouvez le voir ci-dessous, my contient des valeurs consécutives identiques, à savoir 1, 2 et 3.

    Date    Value
0   2017-07-18 07:40:00 1
1   2017-07-18 07:45:00 1
2   2017-07-18 07:50:00 1
3   2017-07-18 07:55:00 2414
4   2017-07-18 08:00:00 2
5   2017-07-18 08:05:00 2
6   2017-07-18 08:10:00 4416
7   2017-07-18 08:15:00 4416
8   2017-07-18 08:20:00 3
9   2017-07-18 08:25:00 3
10  2017-07-18 08:30:00 3
11  2017-07-18 08:35:00 6998

Mon objectif est de détecter ces «valeurs mortes» chaque fois qu'elles sont coincées dans un minimum de 3 lignes et de les changer toutes avec NaN parce que je veux les éliminer.

Voici ma tentative:

df['Value'] = df['Value'].loc[df['Value'].shift() != df['Value']]  

Mais cela donne:

Date    Value
0   2017-07-18 07:40:00 1.0
1   2017-07-18 07:45:00 NaN
2   2017-07-18 07:50:00 NaN
3   2017-07-18 07:55:00 2414.0
4   2017-07-18 08:00:00 2.0
5   2017-07-18 08:05:00 NaN
6   2017-07-18 08:10:00 4416.0
7   2017-07-18 08:15:00 NaN
8   2017-07-18 08:20:00 3.0
9   2017-07-18 08:25:00 NaN
10  2017-07-18 08:30:00 NaN
11  2017-07-18 08:35:00 6998.0

Je veux que tous les 1 et 3 soient modifiés avec NaN comme ci-dessous car ils ont des valeurs similaires pour trois lignes consécutives.

Date    Value
0   2017-07-18 07:40:00 NaN
1   2017-07-18 07:45:00 NaN
2   2017-07-18 07:50:00 NaN
3   2017-07-18 07:55:00 2414.0
4   2017-07-18 08:00:00 2.0
5   2017-07-18 08:05:00 2.0
6   2017-07-18 08:10:00 4416.0
7   2017-07-18 08:15:00 4416.0
8   2017-07-18 08:20:00 NaN
9   2017-07-18 08:25:00 NaN
10  2017-07-18 08:30:00 NaN
11  2017-07-18 08:35:00 6998.0

Je veux utiliser le dérivé. À savoir, si la différence de 3 lignes consécutives <0,0001, changez-les avec NaN.

2
k.ko3n 18 mars 2019 à 19:59

2 réponses

Meilleure réponse

Vous pouvez GroupBy valeurs consécutives à l'aide d'un schéma de regroupement personnalisé, vérifier quels groupes ont une taille supérieure ou égale à 3 et utiliser le résultat pour indexer la trame de données et définir les lignes d'intérêt sur NaN :

g = df.Value.diff().fillna(0).ne(0).cumsum()
m = df.groupby(g).Value.transform('size').ge(3)
df.loc[m,'Value'] = np.nan

    Date   Value
0   2017-07-18-07:40:00     NaN
1   2017-07-18-07:45:00     NaN
2   2017-07-18-07:50:00     NaN
3   2017-07-18-07:55:00  2414.0
4   2017-07-18-08:00:00     2.0
5   2017-07-18-08:05:00     2.0
6   2017-07-18-08:10:00  4416.0
7   2017-07-18-08:15:00  4416.0
8   2017-07-18-08:20:00     NaN
9   2017-07-18-08:25:00     NaN
10  2017-07-18-08:30:00     NaN
11  2017-07-18-08:35:00  6998.0

Où:

df.assign(grouper=g, mask=m, result=df_.Value)

           Date           Value   grouper mask  result
0   2017-07-18-07:40:00      1        0   True     NaN
1   2017-07-18-07:45:00      1        0   True     NaN
2   2017-07-18-07:50:00      1        0   True     NaN
3   2017-07-18-07:55:00   2414        1  False  2414.0
4   2017-07-18-08:00:00      2        2  False     2.0
5   2017-07-18-08:05:00      2        2  False     2.0
6   2017-07-18-08:10:00   4416        3  False  4416.0
7   2017-07-18-08:15:00   4416        3  False  4416.0
8   2017-07-18-08:20:00      3        4   True     NaN
9   2017-07-18-08:25:00      3        4   True     NaN
10  2017-07-18-08:30:00      3        4   True     NaN
11  2017-07-18-08:35:00   6998        5  False  6998.0
1
yatu 18 mars 2019 à 17:28

Comptez les valeurs. Le résultat est une série, il a besoin d'un nom pour d'autres références:

counts = df['Value'].value_counts()
counts.name = '_'

Fusionnez les valeurs sélectionnées de la série avec la trame de données d'origine:

keep = counts[counts < 3]
df.merge(keep, left_on='Value', right_index=True)[df.columns]
#                   Date  Value
#3  2017-07-18  07:55:00   2414
#4  2017-07-18  08:00:00      2
#5  2017-07-18  08:05:00      2
#6  2017-07-18  08:10:00   4416
#7  2017-07-18  08:15:00   4416
#11 2017-07-18  08:35:00   6998

Le résultat est une trame de données filtrée.

Si vous utilisez la version pandas <0,24, vous devez mettre à niveau, mais voici une solution:

df.merge(pd.DataFrame(keep), left_on='Value', right_index=True)[df.columns]
0
DYZ 18 mars 2019 à 17:30