2017-08-16 10 views
2

ich einen Datenrahmen wie dieses:Liste innerhalb Pandas Datenrahmen Zellen

enter image description here

und ich möchte einen neuen Datenrahmen mit einer neuen Spalte, die eine Liste wie folgt enthält: enter image description here

Wie erstelle ich eine Liste innerhalb einer Datenrahmenzelle, die die Elemente enthält, die auf ähnlichen Monaten basieren?

Antwort

4

Lassen Sie versuchen, set_index, groupby und apply(list):

df.set_index('month', append=True).groupby(level=[0,1,2], sort=False)['from']\ 
    .apply(list).reset_index('month') 

Ausgang:

   month from 
google 2016  2  [e] 
apple 2016  1 [b, c] 
     2016  3  [l] 
google 2016  3  [g] 
+1

Schöne 'set_index' :) – Wen

0

Da Sie keinen Code zur Verfügung gestellt excel nur wie Screenshots, wissen, dass es möglich ist, eine Liste als Wert an die Zelle, zum Beispiel durch den Index hinzuzufügen:

df.loc[index, column_name] = list[b, c] 

der Datentyp des Werts wird Objekt sein

1

Meine Methode fast die gleiche mit @ Scott's Antwort, der einzige Unterschied ist nicht einzelne Wert zu Liste konvertieren.

df.set_index('month', append=True).groupby(level=[0,1,2], sort=False)['from']\ 
     .apply(lambda x : x.tolist() if len(x)>1 else x.values[0]).reset_index('month') 

       month from 
google 2016  2  e 
apple 2016  1 [b, c] 
     2016  3  l 
google 2016  3  g 
2

Simpliest ist zusammen, um neue Funktionalität in Pandas 0.20.0+ für groupby von Ebenen und Spalten zu verwenden:

df=df.groupby(['client','year','month'], sort=False)['from'].apply(list).reset_index('month') 
print (df) 
      month from 
client year    
google 2016  2  [e] 
apple 2016  1 [b, c] 
     2016  3  [l] 
google 2016  3  [g] 

Für Skalare mit einer Elementliste Lösung ist ähnlich Wen - benutzerdefinierte Funktion mit if else:

df=df.groupby(['client','year','month'], sort=False)['from'] \ 
    .apply(lambda x: list(x) if len(x)>1 else x.iat[0]).reset_index('month') 
print (df) 
      month from 
client year    
google 2016  2  e 
apple 2016  1 [b, c] 
     2016  3  l 
google 2016  3  g 

Und für Strings, die durch , verbunden sind, verwenden Sie stattdessen joinlist:

df=df.groupby(['client','year','month'], sort=False)['from'] 
    .apply(', '.join).reset_index('month') 
print (df) 
      month from 
client year    
google 2016  2  e 
apple 2016  1 b, c 
     2016  3  l 
google 2016  3  g 
Verwandte Themen