2017-10-17 1 views
2

ich einen Datenrahmen haben, die wie folgt aussehen:Konvertieren langen Tisch zu breit und die Schaffung von Spalten nach den Reihen

Customer_ID  Category Products 
    1    Veg   A 
    2    Veg   B 
    3    Fruit  A 
    3    Fruit  B 
    3    Veg   B 
    1    Fruit  A 
    3    Veg   C 
    1    Fruit  C 

Ich möchte für jede Kategorie die für jeden Kunden-ID, um herauszufinden, welche Produkte gekauft wurden, und erstellen Sie für jedes Produkt eine Spalte entsprechend. Die Ausgabe würde wie folgt aussehen:

Customer_ID  Category Pro_1 Pro_2  Pro_3 
    1    Veg  A  NA   NA 
    1    Fruit  A  NA   C 
    2    Veg  NA  B   NA 
    3    Veg  NA  B   C 
    3    Fruit  A  B   NA 

Antwort

1

Verwenden groupby mit unstack, aber wenn Duplikate Zeilen Daten sind concanecate zusammen:

df = df.groupby(['Customer_ID','Category','Products'])['Products'].sum().unstack() 
df.columns = ['Pro_{}'.format(x) for x in range(1, len(df.columns)+1)] 
df = df.reset_index() 
print (df) 
    Customer_ID Category Pro_1 Pro_2 Pro_3 
0   1 Fruit  A None  C 
1   1  Veg  A None None 
2   2  Veg None  B None 
3   3 Fruit  A  B None 
4   3  Veg None  B  C 

Eine andere Lösung mit Helfer-Säule, Dreier- muss eindeutig sein:

#if not unique triples remove duplicates 
df = df.drop_duplicates(['Customer_ID','Category','Products']) 

df['a'] = df['Products'] 
df = df.set_index(['Customer_ID','Category','Products'])['a'].unstack() 
df.columns = ['Pro_{}'.format(x) for x in range(1, len(df.columns)+1)] 
df = df.reset_index() 
print (df) 
    Customer_ID Category Pro_1 Pro_2 Pro_3 
0   1 Fruit  A None  C 
1   1  Veg  A None None 
2   2  Veg None  B None 
3   3 Fruit  A  B None 
4   3  Veg None  B  C 
+0

Das Problem hier ist, wenn wir entstapeln wir mit so vielen Produkten wie die Anzahl der einzigartigen Werte der Produkte enden. Dies führt zu neuen Spalten, die nicht eng mit der Kunden-ID und der Kategorie übereinstimmen. Ich versuche, Spalten basierend auf den Produkten auf der Gruppenebene – owise

+0

zu erstellen. Ist es möglich Eingabedaten zu ändern? – jezrael

+0

was meinst du mit dem Ändern der Eingabedaten? – owise

0

Try this: (nicht die IO Sache kümmert sie nur für einfaches Kopieren/Einfügen ist)

import pandas as pd 
from io import StringIO 
df = pd.read_csv(StringIO(""" 
Customer_ID  Category Products 
    1    Veg   A 
    2    Veg   B 
    3    Fruit  A 
    3    Fruit  B 
    3    Veg   B 
    1    Fruit  A 
    3    Veg   C 
    1    Fruit  C"""), sep='\s+') 
df = df.join(pd.get_dummies(df['Products'])) 
g = df.groupby(['Customer_ID', 'Category']).sum() 
print(g) 

Ausgang:

     A B C 
Customer_ID Category   
1   Fruit  1 0 1 
      Veg  1 0 0 
2   Veg  0 1 0 
3   Fruit  1 1 0 
      Veg  0 1 1 
1

Eine weitere Option unter Verwendung von crosstab:

Ausgabe:

Products    A B C 
Customer_ID Category   
1   Fruit  1 0 1 
      Veg  1 0 0 
2   Veg  0 1 0 
3   Fruit  1 1 0 
      Veg  0 1 1 

Danach können Sie den Index für eine ähnliche Lösung zurückzustellen, was Sie wollten.

df = df.reset_index() 
Products Customer_ID Category A B C 
0     1 Fruit 1 0 1 
1     1  Veg 1 0 0 
2     2  Veg 0 1 0 
3     3 Fruit 1 1 0 
4     3  Veg 0 1 1 
+0

Die crosstabing geschieht auf Wie können wir die Produkte auf Kunden-ID- und Kategorie-Ebene ausrichten? – owise

Verwandte Themen