python
  • pandas
  • join
  • dataframe
  • pivot
  • 2016-08-23 4 views 3 likes 
    3

    Ich habe zwei Spalten, denen ich beitreten möchte (Jahr und Quartal). Ich habe die Daten aus SQL gezogen und geschwenkt es wie unten zu sehen:Verknüpfen Sie zwei Spalten in einem Dataframe, das geschwenkt wurde

    df3 = pd.pivot_table(df, index=["Year", "Q"], columns='Area', values="Lows", aggfunc=np.sum, fill_value=0) 
    

    ich jetzt die Spalten Year und Q miteinander verbinden möchte Zwecke für Charting aber meine Indizes scheinen vermasselt werden. Im Folgenden wird gezeigt, wie der Datenrahmen angezeigt wird.

    Before: 
    Year Q 
    2003 1 
         2 
         3 
         4 
    2004 1 
         2 
    
    Desired output: 
    Period 
    2003 1 
    2003 2 
    2003 3 
    2003 4 
    

    Antwort

    1

    Dies sollte funktionieren:

    df3.index = df3.index.to_series().apply(lambda x: ' '.join([str(y) for y in x])) 
    

    allgemeineren

    join = lambda x, delim=' ': delim.join([str(y) for y in x]) 
    
    df3.index = df3.index.to_series().apply(join, delim=' ') 
    
    +0

    Ich bin nicht sicher, was das tat, wie mein Jahr und Quartal Spalten und jetzt gelöscht wurden Ich habe eine neue Spalte gefüllt mit "NaN" den ganzen Weg hinunter – spacedinosaur10

    +0

    @ spacedinosaur10 Ich habe das th vernachlässigt Das waren ganze Zahlen. Ich habe es behoben. – piRSquared

    0

    Eine andere schnelle Lösungen:

    df.index = ['{} {}'.format(idx[1], idx[0]) for idx in df.index] 
    

    und

    df.index = [' '.join((str(idx[0]), str(idx[1]))) for idx in df.index] 
    

    Timings:

    In [190]: %timeit df.index.to_series().apply(lambda x: ' '.join([str(y) for y in x])) 
    10 loops, best of 3: 44.5 ms per loop 
    
    In [191]: %timeit [' '.join((str(idx[0]), str(idx[1]))) for idx in df.index] 
    10 loops, best of 3: 26.6 ms per loop 
    
    In [192]: %timeit ['{} {}'.format(idx[1], idx[0]) for idx in df.index] 
    100 loops, best of 3: 19.2 ms per loop 
    

    -Code für Timings:

    df = pd.DataFrame({'A':[2,2,2,1,7,2], 
            'B':[5,5,5,4,7,4], 
            'C':[7,8,9,4,8,1]}) 
    
    df = df.groupby(['A','B']).sum() 
    df = pd.concat([df]*10000) 
    print (df) 
    
    +0

    @piRSquared das war sehr hilfreich, danke. Kann ich der neuen Spalte einen Namen geben? Also kann ich es beim Graphen nennen? – spacedinosaur10

    +0

    Ich habe eine neue Spalte namens 'Periode' erstellt, indem ich df3.index = df3 ['Periode'] eingestellt habe, was für meine Bedürfnisse funktioniert. Aber es wäre nett zu wissen, ob ich jemanden umbenennen könnte, der die verbundene Zeile – spacedinosaur10

    +1

    ist. Sie können 'df3 = df3.rename (columns = {'Period': 'newname'})' verwenden, wenn Sie den Spaltennamen umbenennen müssen. Wenn der Index zurückgesetzt werden muss, verwenden Sie 'df3 = df3.reset_index()' – jezrael

    Verwandte Themen