2017-10-18 3 views
1

J'ai une base de données avec deux colonnes - nom et numéro. Je voudrais regrouper tous les noms basés sur la colonne de nombre et ensuite imprimer les données dans un format de table avec tous les noms avec le nombre 1 et à côté d'eux les noms avec le numéro 2 et ainsi de suite. Par exemple, si l'entrée est:Impression d'un tableau avec un nombre différent d'entrées

name = ['Bob','David','Jane','Mike','Josh','Emily'] 
number = [1,2,3,1,2,1] 
df = pd.DataFrame([name,number]).T 
df.columns = ['name','number'] 

sortie souhaité (mais semble l'espérons beaucoup mieux):

num1  num2 num3 

Bob   David  Jane 

Mike   Josh  

Emily     

Répondre

2

Appel groupby, groupe sur number, convertir un dictionnaire, et recréer votre trame de données.

d = df.groupby('number').name.apply(list).to_dict() 

df = pd.DataFrame({k : pd.Series(v) 
     for k, v in d.items()}).add_prefix('num').fillna('') 

print(df) 
    num1 num2 num3 
0 Bob David Jane 
1 Mike Josh  
2 Emily 
+0

Pouvez-vous confirmer que mon deuxième œuvres d'options? Merci – piRSquared

+0

@piRSquared sûr, le fera quand je suis de retour sur mon PC, si vous ne l'avez pas déjà fait d'ici là! –

1

Utilisation set_index avec cumcount et unstack:

df1 = (df.set_index([df.groupby('number').cumcount(),'number'])['name'] 
     .unstack(fill_value='') 
     .add_prefix('num') 
     .rename_axis(None, 1)) 
print (df1) 
    num1 num2 num3 
0 Bob David Jane 
1 Mike Josh  
2 Emily 

alternatif avec Series de list s:

a = df.groupby('number')['name'].apply(list) 
a.index.name = None 
print (a) 
1 [Bob, Mike, Emily] 
2   [David, Josh] 
3    [Jane] 
Name: name, dtype: object 

df1 = pd.DataFrame(a.values.tolist(), index=a.index).T.add_prefix('num').fillna('') 
print (df1) 
    num1 num2 num3 
0 Bob David Jane 
1 Mike Josh  
2 Emily   
3

Option 1
utilisation defaultdict

from collections import defaultdict 

d = defaultdict(list) 
f = 'num{}'.format 

for nm, nb in zip(df.name, df.number): 
    d[f(nb)].append(nm) 

pd.DataFrame.from_dict(d, orient='index').T.fillna('') 

    num1 num2 num3 
0 Bob David Jane 
1 Mike Josh  
2 Emily    

Option 2

i = df.groupby('number').cumcount().values 
j, c = pd.factorize(df.number.values) 

a = np.empty((i.max() + 1, c.size), dtype='<U32') 
a.fill('') 
a[i, j] = df.name.values 

pd.DataFrame(a, columns=c).add_prefix('num') 

    num1 num2 num3 
0 Bob David Jane 
1 Mike Josh  
2 Emily  
+0

Malheureusement deuxième retour 'a [i, j] = df.nom.values' ->' [['B' 'D' 'J'] ['M' 'J' ''] ['E' ' '' ']] ', donc la sortie est' num1 num2 num3 0 BDJ 1 MJ 2 E ' – jezrael

+0

' ValueError: La forme des valeurs passées est (2, 4), les indices impliquent (3, 4) 'sur le dernier ligne. –

+0

FIFY. :-) Cela fonctionne parfaitement. –