2016-07-20 10 views
2

Problem Einstellungverketten alle möglichen Spaltenwerte anderer einzigartiger Spalte

Angenommen, bin ich den folgenden Datenrahmen gegeben.

ID category 
223 MMO 
223 Game 
444 Finance 
360 Reading 
360 Book 

Dieser Datenrahmen hat eine ID Spalte und es ist category verbunden. Beachten Sie, dass dieselbe ID mehrere Kategorien haben kann.

Mein Ziel ist es, eine neue Spalte zu erstellen, die die Verkettung aller möglichen Kategorien für eine gegebene ID enthält. Das bedeutet:

  • die alte category Spalte
  • Entfernen Entfernen von doppelten ID Reihen

Die Ausgabe würde wie folgt aussehen.

ID category 
223 MMO_Game  
444 Finance  
360 Reading_Book 

Versuchte Lösung

Mein obwohl Prozess war zunächst eine groupby Variable zu erstellen, die Gruppe würde category von ID.

groupby_ID = df['category'].groupby(df['ID']) 

Jetzt kann ich versuchen und durchlaufen die gruppierten Daten und verketten die Zeichenfolgen.

for ID, category in groupby_appID: 

Ich weiß nicht, wie ich an dieser Stelle weitermachen soll. Einige Hinweise würden sehr geschätzt werden!

Antwort

4

Sie können groupby auf ID und dann ein join mit Ihrem gewünschten Trennzeichen gelten:

In [142]: 
df.groupby('ID')['category'].apply('_'.join) 

Out[142]: 
ID 
223  MMO_Game 
360 Reading_Book 
444   Finance 
Name: category, dtype: object 

Um die genaue gewünschte Ausgabe erhalten Sie reset_index mit name param anrufen:

In [145]: 
df.groupby('ID')['category'].apply('_'.join).reset_index(name='category') 

Out[145]: 
    ID  category 
0 223  MMO_Game 
1 360 Reading_Book 
2 444  Finance 
+0

Genius @EdChum! Ich denke, ich habe das Problem übertrieben, keine Notwendigkeit für Schleifen. –

+1

Es ist nicht sofort offensichtlich, dass Sie dies tun können, es ist verlockend, mit 'lambda's oder irgendeiner Art von eingebauter Methode zu beginnen, aber es ist eine schöne kompakte Möglichkeit, das zu erreichen, was Sie wollen – EdChum

+1

Ich sah @EdChum hatte geantwortet und ich wollte nicht seine Antwort, um meine zu beeinflussen. Also schaute ich nicht hin. Ich habe funktionell die gleiche Lösung gefunden, aber das ist eleganter. 'df.groupby ('ID'). category.apply (Lambda x: '_'. join (x))'. Große Antwort @EdChum. – piRSquared

Verwandte Themen