2017-09-29 3 views
0

Ci-dessous est la trame de données avec lesquels je travaille:Python - Comment puis-je extraire la liste colonne Label & Value & Transposer En ce qui concerne ID unique

Row |ID | List 
 
---------------------------------------------------------------------------------------------------------------------------------------------------------------- 
 
1 |45 | [{u'value': u'0', u'label': u'Forum Thread Size'}, {u'value': u'0', u'label': u'Unique Commenters'}, {u'value': u'0', u'label': u'Likes and Votes'}] 
 
2 |76 | [{u'value': u'1', u'label': u'Forum Thread Size'}, {u'value': u'1', u'label': u'Unique Commenters'}, {u'value': u'1', u'label': u'Engagement'}, {u'value': u'0', u'label': u'Likes and Votes'}] 
 
3 |99 | [] 
 
4 |83 | [{u'value': u'0', u'label': u'Forum Thread Size'}, {u'value': u'0', u'label': u'Unique Commenters'}, {u'value': u'0', u'label': u'Likes and Votes'}] 
 
5 |80 | []

Je voudrais comme les données à ressembler à ceci après la transformation, dans une trame de données pandas:

Row \t |ID \t |Forum Thread Size \t |Unique Commenters \t |Engagement \t |Likes and Votes 
 
------------------------------------------------------------------------------------------------------------------------------------------------------ 
 
1 \t |45 \t |0 \t     |0 \t \t   |    |0 
 
2 \t |76 \t |1 \t     |1 \t     |1 \t   |0 
 
3 \t |99 \t | \t \t \t |      |    | 
 
4 \t |83 \t |0 \t     |0 \t \t   |    |0 
 
5 \t |80 \t | \t \t \t |      |    |

Répondre

2

Vous pouvez utiliser apply en boucle dans la colonne List, et convertir chaque liste à un objet pandas.Series avec le label comme l'indice; Cela se traduira par une trame de données avec le label comme les en-têtes de colonne, puis vous pouvez concat avec les colonnes de la trame de données pour obtenir ce dont vous avez besoin:

df1 = pd.concat([ 
    df.drop('List', 1), 
    df.List.apply(lambda lst: pd.Series({ 
     d['label']: d['value'] for d in lst 
    })) 
], axis=1) 
​ 
df1 
# Row ID Engagement Forum Thread Size Likes and Votes Unique Commenters 
#0 1 45  NaN     0     0     0 
#1 2 76   1     1     0     1 
#2 3 99  NaN     NaN    NaN     NaN 
#3 4 83  NaN     0     0     0 
#4 5 80  NaN     NaN    NaN     NaN 
+2

belle et succincte + 1 – Wen

+1

Incroyable! Merci pour l'aide! Je peux maintenant finir mon automatisation ETL –

1

IIUC

df1=df.set_index(['Row','ID']).List.apply(pd.Series).stack().apply(pd.Series).reset_index() 
df1.pivot_table(index=['Row','ID'], columns='label', values='value',aggfunc=np.sum).merge(df[['Row','ID']],left_index=True,right_on=['Row','ID'],how='right') 

Out[334]: 
    Engagement Forum Thread Size Likes and Votes Unique Commenters Row ID 
0  None     0    0     0 1 1 
1   1     1    0     1 2 2 
2  NaN    NaN    NaN    NaN 3 3 

données Entrée:

df = pd.DataFrame({'Row':[1,2,3],'ID':[1,2,3], 'List':[[{u'value': u'0', u'label': u'Forum Thread Size'}, {u'value': u'0', u'label': u'Unique Commenters'}, {u'value': u'0', u'label': u'Likes and Votes'}], [{u'value': u'1', u'label': u'Forum Thread Size'}, {u'value': u'1', u'label': u'Unique Commenters'}, {u'value': u'1', u'label': u'Engagement'}, {u'value': u'0', u'label': u'Likes and Votes'}],[]]})