2017-08-09 2 views
1

im nouveau à Python et je travaille sur panda dataframe.Python: exploser les lignes de panda dataframe

j'ai donc une trame de données comme:

Client_id Nb_Products 
1   2 
2   3 
3   1 

et je dois exploser chaque ligne Nb_Products fois pour chaque CLIENT_ID. donc je dois sortir le tableau suivant:

Client_id Product_Nb 
1   1 
1   2 
2   1 
2   2 
2   3 
3   1 

Au début, je pense que je devrais créer une gamme de numéros pour Nb_Products comme:

Client_id Nb_Products_rng 
1   [1,2] 
2   [1,2,3] 
3   [1] 

Et puis exploser. Mais je ne pouvais pas réussir à créer cela.

Je serai reconnaissant à toute réponse ou partie de réponse. Merci

+0

Personnellement, je déteste l'idée de mettre des listes dans un 'dataframe' pandas géants pour des choses comme ça - je vois tout le temps et il n'est pas nécessaire ici non plus –

Répondre

0

Méthodologie

J'utilise un indice d'une part pour accélérer les choses et obtenir les ids uniques des clients

df = df.set_index('Client_id') 
client_ids = df.index.get_level_values('Client_id').unique() 

Je reconstruis juste la trame de données par itérer sur tous les produits par client

res = pd.DataFrame(
    [ 
     [client, prod] 
     for client in client_ids 
     for prod in range(1, df.loc[client, 'Nb_Products'].max()+1) 
    ], 
    columns = ['Client_id', 'Nb_Products'] 
) 

Exemple/test

Les données de test I utilisé

import pandas as pd 
df = pd.DataFrame(
    [[1, 2], [2, 3], [3, 3]], 
    columns=['Client_id', 'Nb_Products'] 
) 

initial dataframe

Client_id Nb_Products 
0   1   2 
1   2   3 
2   3   3 

Résultat

Client_id Nb_Products 
0   1   1 
1   1   2 
2   2   1 
3   2   2 
4   2   3 
5   3   1 
6   3   2 
7   3   3 
+0

Etes-vous sûr que la sortie correspond à l'exigence de l'OP? N'est-ce pas le retour de la même trame de données –

+0

@ClockSlave Cela retourne exactement ce dont j'avais besoin. Merci pour votre aide je vais aussi essayer votre suggestion et vous le faire savoir. –

0

Vous pouvez le faire simplement en répétant les valeurs Client_idNb_products temps de «exploser votre ensemble de données. Répéter Client_id valeur dans une ligne par la valeur par rapport dans la colonne Nb_products produira la variable Client_id de la nouvelle image. Je fais cela en utilisant la compréhension de la liste.

Pour obtenir la deuxième colonne - Product_Nb vous devez simplement une séquence à partir de 1.

from io import StringIO 
import pandas as pd 

TESTDATA=StringIO("""Client_id Nb_Products 
1 2 
2 3 
3 1""") 

df = pd.read_csv(TESTDATA, sep=" ") 

col1 = [] 
_ = [col1.extend([a]*b) for a,b in zip(df.iloc[:,0].values.tolist(), df.iloc[:,1].values.tolist())] 
col2 = [] 
_ = [col2.extend(list(range(1,i+1))) for i in df.iloc[:,1].values.tolist()] 

df2 = pd.DataFrame(list(zip(col1,col2)),columns = ['Client_id', 'Product_Nb'])