2017-09-19 4 views
2

i ont tableau suivant commevaleurs de la colonne Joining dans une table - pandas géants

mark  name total point 
70  bala 100 10 
80  bala 100 10 
80  bala 100 10 
100 karthik 100  5 
100 karthik 150  5 
100 karthik 150  5 
50  abdul 80  10 
50  abdul 80  5 
50  abdul 80  6 

je veux diviser ce tableau ci-dessous (supprimer la colonne double en fonction du nom et de la colonne unique sera séparés par une virgule)

mark  name  total point 
70,80  bala  100  10 
100  karthik 100,150  5 
50  abdul 80  10,5,6 

Répondre

3

Utilisez

In [858]: (df.astype(str).groupby('name', as_index=False, sort=False) 
      .apply(lambda x: pd.Series({v: ','.join(x[v].unique()) for v in x}))) 
Out[858]: 
    mark  name total point 
0 70,80  bala  100  10 
1 100 karthik 100,150  5 
2  50 abdul  80 10,5,6 

Ou,

In [863]: (df.astype(str).groupby('name', as_index=False, sort=False) 
      .apply(lambda x: x.apply(lambda x: ','.join(x.unique())))) 
Out[863]: 
    mark  name total point 
0 70,80  bala  100  10 
1 100 karthik 100,150  5 
2  50 abdul  80 10,5,6 
+0

super. cela fonctionne – balakrishnan

+0

Nous pouvons également le faire dans un tableau croisé dynamique. Nous pouvons donc économiser beaucoup de paramètres :). Et +1 pour maintenir la commande. – Dark

2

Avec l'aide de tableau croisé dynamique

df.pivot_table(index='name',aggfunc=lambda x : ','.join(x.unique().astype(str))).reset_index() 

Sortie:

 
    name mark point total 
0 abdul  50 10,5,6  80 
1  bala 70,80  10  100 
2 karthik 100  5 100,150 
2

Utilisation DataFrameGroupBy.agg:

df = (df.astype(str) 
     .groupby('name', as_index=False, sort=False) 
     .agg(lambda x: ','.join(x.unique()))) 
print (df) 
     name mark total point 
0  bala 70,80  100  10 
1 karthik 100 100,150  5 
2 abdul  50  80 10,5,6