Je suis Struggeing avec un processus de massage de données. Je pense à une meilleure façon de trouver et de supprimer des entrées sans changement dans Dataframe.
J'ai des données de niveau de signal provenant d'un périphérique mobile p> si fondamentalement et certaines données associées + horodatage p> ce que je dois faire est de filtrer les données de manière suivante: p> Résultats attendus avec fenêtre N = 3 P >
RadioSmall = RadioMeasAll.loc[:,['measLatitude','measLongitude','measCellId','measNetTypeDetail','measOperatorCode','measCid','measLac','measSignalLevel','cellArfcn']].copy()
def f(x):
y = x[~np.isnan(x)]
if len(np.unique(y)) > 1:
return 1
else:
return 0
a = RadioSmall.rolling(window=3, min_periods=1).apply(f,raw=True)
a['sum']=a.sum(axis=1)
b = pd.DataFrame(index=a.index)
b['filtering'] = a['sum']
df_filtered = b.query('filtering>0')
RadioMeasAll.join(df_filtered)
3 Réponses :
Je crois que je comprends votre objectif maintenant. Nous devrions maintenant le diviser en sous-ensembles d'indices consécutifs (idée de cette réponse ) p> Essayez de l'exécuter sur vos données et de voir s'il résout votre problème. P> p> a code> est une matrice contenant des indices de lignes consécutives contenant des valeurs de colonnes code> égales par rapport à la ligne suivante (elle ommites la première occurrence ). P>
duplicate_groups code> contient maintenant des tableaux d'indices consécutifs. Vous pouvez maintenant filtrer pour des doublons consectiques plus longtemps que n, disons
n = 5 code>. P>
Je comprends que les colonnes sont un éventail de colonnes à vérifier. Mais qu'est-ce que ID_? J'ai édité mon message avec mon code d'échantillon et mon ensemble reproductible
Désolé, ID _ code> était censé être
A code>
Après avoir exécuté les deux premières lignes, qu'est-ce que a code> contient?
un retour vide [] code>
colonnes = ["MASLATICITUDE '," MASLONGITUDE "," MASENELLID "," MASENETTYPETEL AIL "," MASELAC ",' MeasSlac", " ',' cavef cn '] df.reeset_index (goutte = false) a = df.index [(df [colonnes] == df [colonnes] .Shift ()). Tout (Axis = 1)] code>
Est-ce que l'une de ces colonnes en float est-elle? Changez votre variable CODE> COLONMES CODE> SELO ILLE A SEULEMENT UNE MASIGNALLEVEL CODE> et voir puis, puis ajoutez plus de colonnes et vérifiez laquelle l'on fait pour être vide.
J'utiliserais un partage de données temporaire de la même index que l'original pour calculer les groupes de valeurs consécutifs, leur taille et le rang d'une rangée dans son groupe.
alors je ne garderais que dans le Dataframe original les rangées ayant un rang sous la fenêtre: p> il donne comme prévu: p> Remarque: Si dans le Dataframe original le Date Time était l'index au lieu d'être une colonne, la définition des doublons changerait à: p>
import numpy as np cols_to_compare = df.columns.drop(['measDate']) # Columns where the values will be compared window_size = 3 has_change = df[cols_to_compare].diff().any(axis=1) df = df[has_change.rolling(window_size).apply(np.any, raw=True).fillna(1, downcast="bool")]
Jetez un coup d'œil à Comment faire de bons exemples de pandas reproductibles - Veuillez poster un sous-ensemble de vos données réelles, pas des captures d'écran des données, Nous pouvons donc reproduire votre problème.
Merci @ W-M pour pointer cela. J'ai édité mon post