1
votes

Python: appliquer du code à une colonne entière de dataframe

J'ai une colonne, col1, dans un dataframe rempli de valeurs.

                            col1                               col2          
row1      [0.0, 6.3, 3.93, 5.27, 8.2, 6.4, 5.6]             [0,100,200,300,400,500,600]                       
row2      [0.0, 5.9, 4.2, 4.1]                              [0,100,200,300]
row3      [0.0, 6.4, 3.9, 8.2, 4.2]                         [0,100,200,300,400]

Chaque ligne contient une série. J'ai besoin d'une nouvelle colonne, disons col2, qui renvoie une nouvelle série. Cette série commence à 0 et augmente de 100 à chaque fois jusqu'à ce que cette série corresponde à la longueur de la série d'origine.

Résultat attendu

                                col1                
row1      [0.0, 6.33839991, 3.93961207, 5.27702178, 8.27702178, 6.44343, 5.668574]             
row2      [0.0, 5.93961207, 4.27702178, 4.12702178]
row3      [0.0, 6.44428501, 3.93961207, 8.27702178, 4.27121178]

Merci !


5 commentaires

Lambda ne peut pas contenir d'affectation


pouvez-vous publier le dataframe? et la valeur attendue? c'est déroutant ce que vous voulez et basé sur quoi


J'ai mis à jour ma question. J'espère que c'est clair!


qu'est-ce que vous avez des doublons dans votre liste?


Les doublons n'ont pas d'importance. Tout ce dont j'ai besoin est la longueur totale de la liste


3 Réponses :


2
votes

Essayez :

def func(x):
    x['col2'] = np.arange(0, len(x['col1'])*100, 100)
    return x
df.apply(lambda x: func(x) , axis=1)


4 commentaires

J'ai édité le code pour améliorer la clarté de ce que j'essaie de faire


Ce code ne résout pas mon problème, juste pour être clair


C'était aussi ma solution et elle obtient la solution requise. Cependant, je l'ai condensé en une seule ligne: df ['col2'] = df ['col1']. Apply (lambda x: np.arange (0, len (x) * 100, 100)) < / code>


Pourriez-vous s'il vous plaît marquer cela comme une solution, si cela vous semble?



2
votes

Essayez ceci si vous voulez la multiplication basée sur chaque chaîne unique (factorisée), pour les éléments dupliqués de la liste, cela retournera des résultats dupliqués:

df.col1.apply(lambda x: np.arange(len(x))*100)


print(df)

                                                   col1  \
row1  [0.0, 6.33839991, 3.93961207, 5.27702178, 8.27...   
row2          [0.0, 5.93961207, 4.27702178, 4.12702178]   
row3  [0.0, 6.44428501, 3.93961207, 8.27702178, 4.27...   

                                   col2  
row1  [0, 100, 200, 300, 400, 500, 600]  
row2                 [0, 100, 200, 300]  
row3            [0, 100, 200, 300, 400] 

Ou suggestion de @jezrael:

df['col2']=df.col1.transform(lambda x: pd.factorize(x)[0]*100)


0 commentaires

2
votes

Ma proposition est:

df['col2'] = df.col1.transform(lambda x: [ i * 100 for i in range(len(x))])


0 commentaires