I have a data structure that is a list of lists of dicts:
[
[{'Height': 86, 'Left': 1385, 'Top': 215, 'Width': 86},
{'Height': 87, 'Left': 865, 'Top': 266, 'Width': 87},
{'Height': 103, 'Left': 271, 'Top': 506, 'Width': 103}],
...
]
I can convert it to a data frame:
detections[0:1]
df = pd.DataFrame(detections)
pd.DataFrame(df.apply(pd.Series).stack())
Which yields:
This is almost what I want, but:
How would I turn the dictionary in each of the cells into a row with columns 'Left', 'Top', 'Width' 'Height'?
To add to Psidom's answer, the list can also be flattened using itertools.chain.from_iterable
.
from itertools import chain
pd.DataFrame(list(chain.from_iterable(detections)))
In my experiments this was about twice as fast for a large number of "chunks."
In [1]: %timeit [r for d in detections for r in d]
10000 loops, best of 3: 69.9 µs per loop
In [2]: %timeit list(chain.from_iterable(detections))
10000 loops, best of 3: 34 µs per loop
If you actually want the index in the final data frame to reflect the original grouping, you can accomplish this with
pd.DataFrame(detections).stack().apply(pd.Series)
Height Left Top Width
0 0 86 1385 215 86
1 87 865 266 87
2 103 271 506 103
1 0 86 1385 215 86
1 87 865 266 87
2 103 271 506 103
You were close, but you need to apply pd.Series
after stacking the indices.
You can loop through the list, construct a list of data frames and then concatenate them:
pd.concat([pd.DataFrame(d) for d in detections])
# Height Left Top Width
#0 86 1385 215 86
#1 87 865 266 87
#2 103 271 506 103
Alternatively, flatten the list firstly and then call pd.DataFrame()
:
pd.DataFrame([r for d in detections for r in d])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With