2016-12-20 2 views
3

ich ein df wie dieses:Pandas df Manipulation: neue Spalte mit Werteliste, wenn andere Spalte Zeilen wiederholt

ID Cluster Product 
1   4  'b' 
1   4  'f' 
1   4  'w' 
2   7  'u' 
2   7  'b' 
3   5  'h' 
3   5  'f' 
3   5  'm' 
3   5  'd' 
4   7  's' 
4   7  'b' 
4   7  'g' 

Wo Identifikation der primäre und eindeutige Schlüssel eines anderen df ist, dass die Quelle für diese df . Cluster ist kein Schlüssel, verschiedene IDs haben oft denselben Clusterwert; Jedenfalls ist es eine Information, die ich weiterführen muss.

Was will ich erreichen, ist dieser Datenrahmen:

ID Cluster Product_List_by_ID 
1   4  ['b','f','w'] 
2   7  ['u','b'] 
3   5  ['h','f','m','d'] 
4   7  ['s','b','g'] 

Wenn dies nicht möglich ist, auch ein Wörterbuch wie dies könnte in Ordnung sein:

d = {ID:[1,2,3,4], Cluster:[4,7,5,7], 
    Product_List_by_ID:[['b','f','w'],['u','b'],['h','f','m','d'],['s','b','g']]} 

ich viele Möglichkeiten erfolglos versucht habe .. es scheint, dass es nicht möglich ist, Listen als Pandas Datenrahmen Werte einzufügen. Wie auch immer ich denke, es sollte nicht so schwierig sein, das Ziel auf eine knifflige Art und Weise zu erreichen .. Tut mir leid, wenn ich verrückt werde, aber ich bin neu Codierung

Irgendwelche Vorschläge ?!

Dank

Antwort

6

Verwendung groupby

df.groupby(['ID', 'Cluster']).Product.apply(list) 

ID Cluster 
1 4    ['b', 'f', 'w'] 
2 7     ['u', 'b'] 
3 5   ['h', 'f', 'm', 'd'] 
4 7    ['s', 'b', 'g'] 
Name: Product, dtype: object 
+0

Was alle Operationen können wir nach groupby tun. Irgendeine gute Ressource dafür? – MYGz

+1

['groupby' docs] (http://pandas.pydata.org/pandas-docs/stable/groupby.html) – piRSquared

+1

@MohammadYusufGhazi thx ... kommentieren ist schwierig für mich :-) – piRSquared

2

Eine andere Lösung wird zunächst ' aus der Kolonne entfernen Product ggf. durch str.strip:

df.Product = df.Product.str.strip("'") 

Und dann groupby mit apply, zuletzt bei Bedarf dictionary Verwendung to_dict mit dem Parameter orient='list'

print (df.groupby(['ID', 'Cluster']) 
     .Product.apply(lambda x: x.tolist()) 
     .reset_index() 
     .to_dict(orient='list')) 

{'Cluster': [4, 7, 5, 7], 
'ID': [1, 2, 3, 4], 
'Product': [['b', 'f', 'w'], ['u', 'b'], 
      ['h', 'f', 'm', 'd'], ['s', 'b', 'g']]} 
+0

Sehr gut: jetzt wird auch die zweite Art, wie ich mich wunderte, erklärt! Jedenfalls kann ich nicht herausfinden, warum dieses Dict [Schlüssel] 17645 ist, während df 17668 verschiedene IDs hat. –

+0

Ja, ich denke jetzt darüber nach. Sind Daten vertraulich? Wie testen Sie ihre Länge? – jezrael

+0

Sie können die Länge mit 'print (len (df.drop_duplicates (['ID', 'Cluster'])) überprüfen.)) - entfernen Sie die Duplikate nach der ersten und zweiten Spalte und überprüfen Sie dann die Länge des Indexes. – jezrael

Verwandte Themen