2 votes

Colonne de listes vers colonne de tuples dans pandas

Je me suis gratté la tête pour essayer de comprendre pourquoi mes tentatives de créer une colonne de tuple à partir d'une colonne de listes ne fonctionnent pas comme je l'espère. Voici donc quelque chose qui fonctionne :

def convert(list):
    return tuple(list)

list = ['aaaa', 'aaaa', 'd33f3f', 'sdjd3i']
print(convert(list))

('aaaa', 'aaaa', 'd33f3f', 'sdjd3i')

Dans mon cas, mon cadre de données ressemble à ceci :

  CLOUD_STORE_ID                     CalculationId        Date
0             772  ff80818178f93bd9017bf5094e602b05  2021-09-17
1             772  ff80818178f93bd9017bf509b4f52b0a  2021-09-17
2             772  ff80818178f93bd9017bf50ccb2c2b20  2021-09-17
0             773  ff80818178f93bd9017bf510f2a12b40  2021-09-17
1             773  ff80818178f93bd9017bf514e2582b55  2021-09-17
2             773  ff80818178f93e26017bf510b2b30c0e  2021-09-17
0             900  ff80818178f93bd9017bf510791f2b39  2021-09-17
1             900  ff80818178f93bd9017bf5109db22b3b  2021-09-17
2             900  ff80818178f93bd9017bf5139e9a2b4d  2021-09-17
0             777  ff80818178f93e26017bf50a780e0bec  2021-09-17

mais j'ai besoin de la liste des cordes :

CalculationID_df = CalculationID_df.groupby('CLOUD_STORE_ID').agg({ 'CalculationId': lambda x: '{}'.format(list(x))}).reset_index()

ce qui donne :

CLOUD_STORE_ID                                      CalculationId
0             486  ['ff80818178f93bd9017bf521bbfd2b6b', 'ff808181...
1             522               ['ff80818178f93e26017bf4efb6fb0bb6']
2             665  ['ff80818178f93bd9017bf4f7dda12acb', 'ff808181...
3             671  ['ff80818178f93bd9017bf51890802b5d', 'ff808181...
4             772  ['ff80818178f93bd9017bf5094e602b05', 'ff808181...

En fait, j'ai besoin de n-uplets à passer à une requête SQL, donc je dois transformer ces listes en n-uplets. Je pensais que la méthode ci-dessus ferait l'affaire :

def convert(list):
    return tuple(list)
CalculationID_df['Calcs'] = CalculationID_df.CalculationId.apply(convert)

Mais il revient :

CLOUD_STORE_ID                                      CalculationId  \
0             486  ['ff80818178f93bd9017bf521bbfd2b6b', 'ff808181...   
1             522               ['ff80818178f93e26017bf4efb6fb0bb6']   
2             665  ['ff80818178f93bd9017bf4f7dda12acb', 'ff808181...   

                                               Calcs  
0  ([, ', f, f, 8, 0, 8, 1, 8, 1, 7, 8, f, 9, 3, ...  
1  ([, ', f, f, 8, 0, 8, 1, 8, 1, 7, 8, f, 9, 3, ...  
2  ([, ', f, f, 8, 0, 8, 1, 8, 1, 7, 8, f, 9, 3, ..

ce qui n'est clairement pas ce que j'attendais.

Qu'est-ce que je fais de mal ?

2voto

Niv Dudovitch Points 1194

Le problème est que votre liste est une chaîne de caractères "['dasdas','dasd']" vous devez le convertir en liste avant de le convertir en tuples.

Après cette rangée :

CalculationID_df = CalculationID_df.groupby('CLOUD_STORE_ID').agg({ 'CalculationId': lambda x: '{}'.format(list(x))}).reset_index()

Ajoutez ce code :

import ast
CalculationID_df.CalculationId = CalculationID_df.CalculationId.apply(lambda x: ast.literal_eval(x))

Et ensuite les convertir en tuples comme vous l'avez fait auparavant.

Résultat :

enter image description here

1voto

Corralien Points 6849

IIUC

>>> df.groupby('CLOUD_STORE_ID')['CalculationId'] \
      .apply(tuple).astype(str).reset_index()

   CLOUD_STORE_ID                                      CalculationId
0             772  ('ff80818178f93bd9017bf5094e602b05', 'ff808181...
1             773  ('ff80818178f93bd9017bf510f2a12b40', 'ff808181...
2             777              ('ff80818178f93e26017bf50a780e0bec',)
3             900  ('ff80818178f93bd9017bf510791f2b39', 'ff808181...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X