2017-08-10 2 views
1

j'ai une df telle quePandas: convertir chaque ligne à un <nom de la colonne, la valeur de la ligne> dict et ajouter une nouvelle colonne

  STATUS_ID    STATUS_NM 
0     1    A 
1     2    B 
2     3    C 
3     4    D 

Je veux effectuer une ligne par appliquer pour obtenir une clé, valeur par par pour chaque ligne dans une colonne séparée. La df finale devrait être

     STATUS 
0     {STATUS_ID:1,STATUS_NM:A} 
1     {STATUS_ID:2,STATUS_NM:B} 
2     {STATUS_ID:3,STATUS_NM:C} 
3     {STATUS_ID:4,STATUS_NM:D} 

MISE À JOUR: J'ai essayé df[cols].apply(pd.Series.to_dict, axis=1) et df[cols].apply(lambda x: x.to_dict(), axis=1) mais au lieu d'obtenir le dict réelle, je reçois <built-in method values of dict object at 0x00...

Je crois que son ma version de pandas géants à l'origine du problème . Cela a été discuté ici - https://github.com/pandas-dev/pandas/issues/8735 Donc la question est de savoir s'il existe une autre façon d'effectuer la même opération pour contourner ce problème. Je ne peux pas mettre à jour ma version Pandas à 0,17

+0

Avec quelle partie vous battez-vous? Définir un dictionnaire? Obtenir chaque rangée de la table? Ajouter une nouvelle colonne? Enlever les vieilles colonnes? Essayez d'être aussi précis que possible dans votre question afin que nous puissions vous aider. –

+0

S'il vous plaît voir mes mises à jour. Merci – Fizi

+0

@Fizi J'ai ajouté une solution de boucle explicite. Vérifiez s'il vous plaît. – ayhan

Répondre

6
df['STATUS'] = df.apply(pd.Series.to_dict, axis=1) 

df 
Out: 
    STATUS_ID STATUS_NM        STATUS 
0   1   A {'STATUS_NM': 'A', 'STATUS_ID': 1} 
1   2   B {'STATUS_NM': 'B', 'STATUS_ID': 2} 
2   3   C {'STATUS_NM': 'C', 'STATUS_ID': 3} 
3   4   D {'STATUS_NM': 'D', 'STATUS_ID': 4} 

Si dans votre dataframe réel, vous avez d'autres colonnes aussi, vous devrez peut-être spécifier les colonnes que vous voulez avoir dans le dictionnaire.

cols = ['STATUS_ID', 'STATUS_NM'] 
df['STATUS'] = df[cols].apply(pd.Series.to_dict, axis=1) 

Une alternative serait itérer sur la dataframe:

lst = [] 
for _, row in df[cols].iterrows(): 
    lst.append({col: row[col] for col in cols}) 

Cela crée une liste:

[{'STATUS_ID': 1, 'STATUS_NM': 'A'}, 
{'STATUS_ID': 2, 'STATUS_NM': 'B'}, 
{'STATUS_ID': 3, 'STATUS_NM': 'C'}, 
{'STATUS_ID': 4, 'STATUS_NM': 'D'}] 

Vous pouvez directement assigner à votre dataframe:

df['STATUS'] = lst 
+0

pour une raison étrange lorsque je fais cette opération, j'obtiens Fizi

+0

@Fizi Pouvez-vous poster le code qui a produit ces valeurs? – ayhan

+0

Je ne peux pas pour des raisons exclusives, mais si le code fourni ici devrait fonctionner alors je vais regarder dans ce qui cause le mien ne fonctionne pas – Fizi