2017-01-02 26 views
1

Ich versuche, eine "richtig füllen" Excel-ähnliche Funktion zu replizieren, die die Werte rechts füllt, bis der nächste Wert nicht null/nan/empty ist. Diese "Rechts-Füllen" Übung ist nur dann durchzuführen, wenn der Wert in der unmittelbar folgenden Zeile nicht leer oder "nan" ist. Darüber hinaus muss dies für jede Gruppe erledigt werden. Ich habe den folgenden Pandas-Datensatz. Meine aktuelle Eingabetabelle ist "have". Meine Ausgabetabelle ist "wollen".Python Pandas richtige Füllwerte basierend auf Gruppen

Ich bin nur ein Anfänger in Python. So würde jede Hilfe geschätzt werden. Auch für diejenigen, die diese Operation möchte auf eine werden, indem Gruppenoperation durchgeführt, Daten wie folgt: Table „haben“, wie er mit Gruppierungsfeld „Gruppen“ folgt:

import pandas as pd 
    have = pd.DataFrame({ \ 
    "groups": pd.Series(["group1","group1","group1","group2","group2","group2"]) \ 
    ,"0": pd.Series(["abc","1","something here","abc2","1","something here"]) \ 
    ,"1": pd.Series(["","2","something here","","","something here"]) \ 
    ,"2": pd.Series(["","3","something here","","3","something here"]) \ 
    ,"3": pd.Series(["something","1","something here","something","1","something here"]) \ 
    ,"4": pd.Series(["","2","something here","","2","something here"]) \ 
    ,"5": pd.Series(["","","something here","","","something here"]) \ 
    ,"6": pd.Series(["","","something here","","","something here"]) \ 
    ,"7": pd.Series(["cdf","5","something here","mnop","5","something here"]) \ 
    ,"8": pd.Series(["","6","something here","","6","something here"]) \ 
    ,"9": pd.Series(["xyz","1","something here","xyz","1","something here"]) \ 
    }) 

Tabelle „wollen“ mit Gruppierungsfelder "Gruppen":

import pandas as pd 
    want = pd.DataFrame({ \ 
    "groups": pd.Series(["group1","group1","group1","group2","group2","group2"]) \ 
    ,"0": pd.Series(["abc","1","something here","anything","1","something here"]) \ 
    ,"1": pd.Series(["abc","2","something here"," anything ","2","something here"]) \ 
    ,"2": pd.Series(["abc","3","something here"," anything ","3","something here"]) \ 
    ,"3": pd.Series(["something","1","something here","","","something here"]) \ 
    ,"4": pd.Series(["something ","2","something here","","","something here"]) \ 
    ,"5": pd.Series(["","","something here","","","something here"]) \ 
    ,"6": pd.Series(["","","something here","","","something here"]) \ 
    ,"7": pd.Series(["cdf","5","something here","mnop","5","something here"]) \ 
    ,"8": pd.Series(["cdf ","6","something here"," mnop ","6","something here"]) \ 
    ,"9": pd.Series(["xyz","1","something here","xyz","1","something here"]) \ 
    }) 

ich habe versucht, diesen Code zu verwenden, aber ich bin immer noch versuchen, vertraut mir mit groupby und apply Aussagen:

grouped=have.groupby('groups') 
have.groupby('groups').apply(lambda g: have.loc[g].isnull()) 
#cond = have.loc[1].isnull() | have.loc[1].ne('') 
want.loc[0, cond] = want.loc[0, cond].str.strip().replace('', None) 
want 

Antwort

1
def fill(df): 
    df = df.copy() 
    i0, i1 = df.index[0], df.index[1] 
    cond = have.loc[i1].isnull() | have.loc[i1].ne('') 
    df.loc[i0, cond] = df.loc[i0, cond].str.strip().replace('', None) 
    return df 


have.groupby('groups', group_keys=False).apply(fill) 

enter image description here

+0

Danke piRSquared. U Genie :) – Seb

Verwandte Themen