J'ai un dataframe qui contient plus d'un millier d'enregistrements et je voudrais retourner un dataframe découpé dans lequel les valeurs sont ordonnées de la même manière que la liste. h1> Entrée
date season hot_or_cold 0 2012-01-01 Winter 0 1 2012-01-02 Winter 1 2 2012-01-03 Winter 0 3 2012-01-04 Winter 0 4 2012-01-05 Winter 0 5 2012-01-06 Winter 1
date season hot_or_cold
0 2012-01-01 Winter 0
1 2012-01-02 Winter 1
2 2012-01-03 Winter 0
3 2012-01-04 Winter 0
4 2012-01-05 Winter 0
5 2012-01-06 Winter 1
6 2012-01-07 Winter 1
7 2012-01-08 Winter 1
8 2012-01-09 Winter 0
9 2012-01-10 Winter 1
10 2012-01-11 Winter 0
# 1 - hot
# 0 - cold
Merci d'avance
3 Réponses :
Définissez 2 fonctions suivantes:
Rechercher une correspondance entre s (une série , plus longue) et lst (une liste, plus courte).
date season hot_or_cold 0 2012-01-01 Winter 0 1 2012-01-02 Winter 1 2 2012-01-03 Winter 0 3 2012-01-04 Winter 0 4 2012-01-05 Winter 0 5 2012-01-06 Winter 1
Lorsqu'une correspondance a été trouvée, le résultat est les deux bordures de tranche, sinon une paire de valeurs None .
Obtenir un fragment de df avec la colonne hot_or_cold correspondant à lst :
def getFragment():
i1, i2 = fndMatch(df.hot_or_cold, lst)
if i1 is None:
return None
else:
return df.iloc[i1:i2]
Lorsque vous l'appelez ( getFragment () ), le résultat est:
def fndMatch(s, lst):
len1 = s.size
len2 = len(lst)
for i1 in range(len1 - len2 + 1):
i2 = i1 + len2
if s.iloc[i1:i2].eq(lst).all():
return (i1, i2)
return (None, None)
La question de base est de trouver un modèle dans dataframe et j'ai obtenu ce ici et l'ont mis en œuvre.
import pandas as pd import numpy as np arr = [0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1] df = pd.DataFrame(data = arr, columns=['binary']) pattern = [0,1, 0, 0, 0, 1] matched = df.rolling(len(pattern)).apply(lambda x:all(np.equal(x, pattern))) matched = matched.sum(axis = 1).astype(bool) #Sum to perform boolean OR idx_matched = np.where(matched)[0] subset = [range(match-len(pattern)+1, match+1) for match in idx_matched] result = pd.concat([df.iloc[subs,:] for subs in subset], axis = 0) result
@deepak_sen, merci. Le lien que vous avez fourni m'a aidé a aidé à retourner exactement ce que je cherchais.
autrement avec la fonction d'accumulation
from itertools import accumulate
import pandas as pd
def accum(x):
return list(accumulate(x))
lst = [0,1,0,0,0,1]
f = lambda x : accum([[i] for i in x])
b = df.groupby(['season'])['hot_or_cold'].apply(f)
df['col_accum2'] = [(('Match ' if item[-len(lst):] == lst else 'NotMatch') if len(item) >= len(lst) else 'small list' ) for subitem in b for item in subitem]
Bonjour et bienvenue sur StackOverflow! Vous semblez avoir l'impression que StackOverflow est un site sur lequel vous postez un problème et obtenez du code en retour. Ce n'est en fait pas le cas. Votre question sera très probablement fermée ou même supprimée sous peu. Pour éviter que cela ne se reproduise à l'avenir, veuillez faire le tour et jetez un œil au centre d'aide . En particulier, informez-vous de ce qui est considéré comme sur le sujet ici
Désolé si la façon dont les tables se sont avérées.