2017-08-25 5 views
3

ich einige Daten in dieser Form haben:Pandas Datenrahmen aus der Liste/dict/Liste

a = [{'table': 'a', 'field':['apple', 'pear']}, 
    {'table': 'b', 'field':['grape', 'berry']}] 

Ich möchte einen Datenrahmen erstellen, die wie folgt aussieht:

field table 
0 apple  a 
1 pear  a 
2 grape  b 
3 berry  b 

Wenn ich versuche dies:

pd.DataFrame.from_records(a) 

ich dieses:

  field table 
0 [apple, pear]  a 
1 [grape, berry]  b 

Ich benutze eine Schleife, um meine ursprünglichen Daten zu restrukturieren, aber ich denke, dass es ein einfacheres und einfacheres methid geben muss.

+1

Wie Sie tun abfließen 'berry c'? Sollte es nicht "b" sein? – umutto

+0

@umutto ist korrekt - ich werde Frage –

Antwort

4

Sie können eine Liste Verständnis verwenden, um eine Reihe von Datenrahmen verketten, einen für jedes Wörterbuch in a.

>>> pd.concat([pd.DataFrame({'table': d['table'], # Per @piRSquared for simplification. 
          'field': d['field']}) 
       for d in a]).reset_index(drop=True) 
    field table 
0 apple  a 
1 pear  a 
2 grape  b 
3 berry  b 
+0

Ich liebe das! Clever! – piRSquared

+0

Dies ist die Lösung, die ich verwendet habe. Perfekt. –

4

Option 1
Verstehens

pd.DataFrame([{'table': d['table'], 'field': f} for d in a for f in d['field']]) 

    field table 
0 apple  a 
1 pear  a 
2 grape  b 
3 berry  b 

Option 2
rekonstruieren

d1 = pd.DataFrame(a) 
pd.DataFrame(dict(
    table=d1.table.repeat(d1.field.str.len()), 
    field=np.concatenate(d1.field) 
)).reset_index(drop=True) 

    field table 
0 apple  a 
1 pear  a 
2 grape  b 
3 berry  b 

Option 3
Rubiks Cube

pd.DataFrame(a).set_index('table').field.apply(pd.Series) \ 
    .stack().reset_index('table', name='field').reset_index(drop=True) 

    table field 
0  a apple 
1  a pear 
2  b grape 
3  b berry 
+0

bearbeiten Ich bevorzuge Option 1. Da 'Tabelle' ein Skalar ist, kann ich nur seinen Wert nehmen. – Alexander

+0

Option 3 ist eine interessante Herangehensweise, obwohl ich sie in den nächsten sechs Monaten nicht wiederholen möchte und WTF fragen würde, habe ich damals geschrieben ... (-; – Alexander

+0

Amen dazu. Aber hey! Es ist eine Zeile und das hat Ich habe gehört, dass eine Zeile die Dinge schneller macht und Zuckerwatte wie Einhörner schmeckt. – piRSquared

0

Oder Sie können versuchen pd.wide_to_long mit, ich will lreshape verwenden, aber es ist nicht dokumentiert und persönlich nicht zu empfehlen ... T _ T

a = [{'table': 'a', 'field':['apple', 'pear']}, 
    {'table': 'b', 'field':['grape', 'berry']}] 
df=pd.DataFrame.from_records(a) 

df[['Feild1','Feild2']]=df.field.apply(pd.Series) 
pd.wide_to_long(df,['Feild'],'table','lol').reset_index().drop('lol',axis=1).sort_values('table') 

Out[74]: 
    table Feild 
0  a apple 
2  a pear 
1  b grape 
3  b berry 
Verwandte Themen