0
votes

Python: Je voudrais retourner un sous-ensemble de dataframe basé sur une liste, si les enregistrements sont classés de la même manière que la liste

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

Sortie

    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


2 commentaires

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.


3 Réponses :


0
votes

Définissez 2 fonctions suivantes:

  1. 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 .

  2. 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) 


0 commentaires

0
votes

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


1 commentaires

@deepak_sen, merci. Le lien que vous avez fourni m'a aidé a aidé à retourner exactement ce que je cherchais.



0
votes

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]


0 commentaires