2016-11-21 1 views
1

Ich habe den folgenden Datenrahmen, mit bestimmten Werten in der Spalte: ID 'wiederholen. Ich möchte Gruppe von der datafarmepandas groupby auf Datenframe und Zuweisung zurück zu orignal df schlägt mit der Transformation

df = pd.DataFrame(
    {'Score': [0.65, 0.57, 0.56, 0.689, 0.56, 0.85, 0.45, 0.15, 0.14, 0.4678], 
    'ID': ['AAA', 'BBB', 'SAS', 'SAP', 'TCS', 'BBB', 'CTC', 'CTC', 'CTC', 'CTC'], 
    'Sample': ['AE01', 'AE01', 'AE03', 'AE03', 'AE03', 'AE05', 'AE05', 'AE05', 'AE05', 'AE05'], 
    'Freq': [1, 14, 14, 15, 16, 17, 18, 19, 20, 21], 
    'Type': ['Non', 'IND', 'IND', 'IND', 'IND', 'IND', 'IND', 'IND', 'IND', 'IND']}, 
    columns=['Sample','ID','Type','Score','Freq']) 

Wenn ich versuche, die ‚Re‘ Spalte auf die Gruppe von Option hinzufügen, um es durch folgende Einzeiler transform

df['Re']=df.drop_duplicates(['Sample','ID']).groupby(['ID']).transform(size) 
mit auf den ursprünglichen Datenrahmen df zugewiesen zu bekommen

ich folgende Fehler bekommen,

ValueError: Wrong number of items passed 4, placement implies 1 

ich weiß, ich könnte den ursprünglichen Datenrahmen zu der Gruppe von Ergebnissen zugewiesen bekommen Sie verschmelzen, aber wenn ich fusioniere ich bekomme bestimmte Zeilen, die mehrere Male in der ursprünglichen df wiederholen, die ich nicht brauche. Jede bessere Lösung wäre großartig. Danke

Antwort

1

Ich glaube, Sie zuerst neue DataFrame Ausgabe von drop_duplicates zuweisen müssen, weil offensichtlich drop_duplicates einige Duplikate Zeilen entfernen (falls vorhanden), so können keine neuen Spalte zuweisen Re original df.

Ein weiteres Problem ist, fügen Sie Series zu [] für groupby hinzu, weil transform nur mit Series arbeiten. Wenn Sie size verwenden, können Sie einige der Spalten verwenden, die nicht zum Gruppieren verwendet werden, hier ist es ID.

df = df.drop_duplicates(['Sample','ID']) 
df['Re']= df.groupby(['ID'])['Sample'].transform('size') 
print (df) 
    Sample ID Type Score Freq Re 
0 AE01 AAA Non 0.650  1 1 
1 AE01 BBB IND 0.570 14 2 
2 AE03 SAS IND 0.560 14 1 
3 AE03 SAP IND 0.689 15 1 
4 AE03 TCS IND 0.560 16 1 
5 AE05 BBB IND 0.850 17 2 
6 AE05 CTC IND 0.450 18 1 

df = df.drop_duplicates(['Sample','ID']) 
df['Re']= df.groupby(['ID'])['Type'].transform('size') 
print (df) 
    Sample ID Type Score Freq Re 
0 AE01 AAA Non 0.650  1 1 
1 AE01 BBB IND 0.570 14 2 
2 AE03 SAS IND 0.560 14 1 
3 AE03 SAP IND 0.689 15 1 
4 AE03 TCS IND 0.560 16 1 
5 AE05 BBB IND 0.850 17 2 
6 AE05 CTC IND 0.450 18 1 

Wenn zuweisen nicht, erhalten NaN:

df['Re']= df.drop_duplicates(['Sample','ID']).groupby(['ID'])['Sample'].transform('size') 
print (df) 
    Sample ID Type Score Freq Re 
0 AE01 AAA Non 0.6500  1 1.0 
1 AE01 BBB IND 0.5700 14 2.0 
2 AE03 SAS IND 0.5600 14 1.0 
3 AE03 SAP IND 0.6890 15 1.0 
4 AE03 TCS IND 0.5600 16 1.0 
5 AE05 BBB IND 0.8500 17 2.0 
6 AE05 CTC IND 0.4500 18 1.0 
7 AE05 CTC IND 0.1500 19 NaN 
8 AE05 CTC IND 0.1400 20 NaN 
9 AE05 CTC IND 0.4678 21 NaN 
+0

Danke das funktioniert :) – user1017373

+0

Glad kann Ihnen helfen! – jezrael