2017-09-11 3 views
1

vereinfachtes Beispiel dafür, was ich habe jetzt:verketten iterable von defaultdicts in Datenrahmen

from collections import defaultdict 

d1 = defaultdict(list) 
d2 = defaultdict(list) 

d1['a'] = [1, 2, 3] 
d1['b'] = [True, True, True] 

d2['a'] = [4, 5 , 6] 
d2['b'] = [False, False, False] 

Wunschergebnis:

a  b 
0 1 True 
1 2 True 
2 3 True 
3 4 False 
4 5 False 
5 6 False 

Diese Linie unten funktionieren wird, aber ich bin auf der Suche nach einer Alternative, die doesn Sie müssen keinen separaten DataFrame für jedes Standarddict instanziieren.

pd.concat([pd.DataFrame(d) for d in (d1, d2)]).reset_index(drop=True) 

Könnte auch beginnen mit:

pd.DataFrame([d1, d2]) 

und wandeln das zu lange Format.

Antwort

3

Sie könnten die dicts und dann instanziieren Sie Ihren Datenrahmen.

d3 = {k : d1[k] + d2[k] for k in d1} 
d3 
{'a': [1, 2, 3, 4, 5, 6], 'b': [True, True, True, False, False, False]} 

df = pd.DataFrame(d3) 
df 
    a  b 
0 1 True 
1 2 True 
2 3 True 
3 4 False 
4 5 False 
5 6 False 

Automatisieren der Zusammenführung für mehrere Objekte:

d3 = defaultdict(list) 
for d in dict_list: 
    for k in d: 
     d3[k].extend(d[k]) 

df = pd.DataFrame(d3) 
1

Durch Ihre pd.concat

pd.DataFrame([d1, d2]).stack().apply(pd.Series).unstack(-2).\ 
    T.sort_index(level=1).reset_index(drop=True) 

Out[648]: 
    a b 
0 1 1 
1 2 1 
2 3 1 
3 4 0 
4 5 0 
5 6 0 
mit
Verwandte Themen