2016-05-06 20 views
1

ich einen Datenrahmen haben df1Python Pandas GROUPBY und subtrahieren Spalten aus verschiedenen Gruppen

pid  stat  h1   h2  h3  h4  h5  h6  ...  h20 

1  a  3.2  3.5  6.2  7.1 1.2  2.3 ... 3.2 
1  b  3.3  1.5  4.2  7.7 4.2  3.5 ...  8.4 
1  a  3.1  3.8  2.2  1.1 6.2  5.3 ...  9.2 
1  b  3.7  1.2  8.2  4.7 3.2  8.5 ...  2.4 
:  :   :   :   :  :  :  :  :  : 
2  a  2.2  3.8  6.2  7.3 1.3  4.3 ...  3.2 
2  b  4.3  1.3  4.2  5.7 2.2  3.1 ...  2.4 
2  a  2.1  3.7  2.4  1.6 6.4  9.3 ...  9.6 
2  b  3.8  1.3  8.7  3.7 7.2  8.3 ...  9.4 
:  :   :   :   :  :  :  :  :  : 
3  a  2.2  3.8  6.2  7.3  1.3  4.3 ...  3.2 
3  b  4.3  1.3  4.2  5.7  2.2  3.1 ...  2.4 
3  a  2.1  3.7  2.4  1.6  6.4  9.3 ...  9.6 
3  b  3.8  1.3  8.7  3.7  7.2  8.3 ...  9.4 
    :  :   :   :   :  :  :  :  :  : 

Ich mag würde Gruppen auf pid und stat indiziert erhalten und dann h Werte von Gruppe1 aus h Werte von group2 für eine endgültige subtrahieren dataframe (df2). Dieser letzte Datenrahmen muss mit Zahlen neu indiziert werden, beginnend mit 0:len(groups) Wiederhole es iterativ für alle Permutationen von PID wie 1-2, 1-3, 1-4, 2-1, 2-3 ... usw. Ich muss andere durchführen Berechnungen zu dem auf dem letzten Datenrahmen df2 (Wert im unten df2 nicht abgezogen werden exakt, sondern nur eine Darstellung)

pid(string)  stat h1p1-h1p2 h2p1-h2p2 h3p1-h3p2 h4p1-h4p2 h5p1-h5p2 h6p1-h6p2 ... h20p1-h2p2 

    1-2   a  3.2   3.5   6.2   7.1   1.2   2.3  ...  3.2 
    1-2   b  3.3   1.5   4.2   7.7   4.2   3.5  ...  8.4 
    1-2   a  3.1   3.8   2.2   1.1   6.2   5.3  ...  9.2 
    1-2   b  3.7   1.2   8.2   4.7   3.2   8.5  ...  2.4 
    1-3  .... 

ich Optionen sah;

for (pid, stat), group in df1.groupby(['pid', 'stat']): 
     print('pid = %s Stat = %s' %(pid, stat)) 
     print group 

das gibt mir Gruppen, aber ich bin nicht sicher, wie Datenrahmen von diesem for-Schleife zuzugreifen und sie von anderen Gruppen zu subtrahieren. Auch

df_grouped = df.groupby(['pid', 'stat']).groups() 

immer noch nicht sicher, wie Sie auf den neuen Datenrahmen von Gruppen zugreifen und Operationen ausführen. Ich würde gerne wissen, ob dies mit groupby getan werden kann oder ob es einen besseren Ansatz gibt. Danke im Voraus!

Antwort

0

Ich implementierte einen Generator und ignorierte die stat Spalte, weil es in keiner Gruppen entsprechend Ihrer Probe unterscheidet. Bitte sag mir, wenn ich es falsch gemacht habe.

import pandas as pd 
from itertools import permutations 

def subtract_group(df, col): 
    pid = df['pid'].unique() 

    # select piece with pid == i 
    segment = lambda df, i: df[df['pid'] == i].reset_index()[col] 

    for x, y in permutations(pid, 2): 
     result_df = pd.DataFrame(segment(df, x) - segment(df, y)) 

     # rename columns 
     result_df.columns=["%sp%d-%sp%d" % (c, x, c, y) for c in col] 

     # insert pid column 
     result_df.insert(0, 'pid', '-'.join([str(x), str(y)])) 

     yield result_df 

Sie können es testen mit:

# column name in your case 
columns = ['h' + str(i+1) for i in range(20)] 

print next(subtract_group(df1, columns)) 

Hoffe, es hilft.

+0

Perfekte Antwort. Vielen Dank! – Jagruth

Verwandte Themen