python pandas: преобразовать список словарей в длинный формат данных panda - PullRequest
0 голосов
/ 03 февраля 2020

У меня список словаря выглядит как данные, например:

 {'a.wav': array([ 0.        ,  1        ]),
 'b.wav': array([2, 3,   0. ]),
 'c.wav': array([6,7, 11, 8,   9 ])
 }

количество элементов в каждом элементе ключа (например, a.wav) в целом не то же самое, я хочу преобразовать его в формат данных следующего формата:

name  value index
a.wav 0      1
a.wav 1      2
b.wav 2      1
b.wav 3      2
b.wav 0      3
c.wav 6      1
c.wav 7      2
c.wav 11     3
c.wav 8      4 
c.wav 8      5 

я знаю, что могу преобразовать его в широкоформатный pd на pd.DataFrame(dict([ (k,pd.Series(v)) for k,v in data.iteritems() ])).T

, но я застрял на том, как преобразовать его напрямую из списка в длинный формат с индексом, подсчитывающим количество элементов в каждом элементе списка.

1 Ответ

0 голосов
/ 03 февраля 2020

Метод 1:

Использование pd.concat с GroupBy.cumcount:

df = pd.concat(pd.DataFrame({'name':k, 'value':v}) for k, v in x.items())
df['index'] = df.groupby('name').cumcount().add(1)

    name  value  index
0  a.wav    0.0      1
1  a.wav    1.0      2
0  b.wav    2.0      1
1  b.wav    3.0      2
2  b.wav    0.0      3
0  c.wav    6.0      1
1  c.wav    7.0      2
2  c.wav   11.0      3
3  c.wav    8.0      4
4  c.wav    9.0      5

Метод 2:

Использование pd.concat с DataFrame.stack :

df = (
    pd.concat([pd.DataFrame(data=v, columns=[k]).T for k, v in x.items()])
      .stack()
      .reset_index(name='value')
      .rename(columns={'level_0':'name', 'level_1':'index'})
)

    name  index  value
0  a.wav      0    0.0
1  a.wav      1    1.0
2  b.wav      0    2.0
3  b.wav      1    3.0
4  b.wav      2    0.0
5  c.wav      0    6.0
6  c.wav      1    7.0
7  c.wav      2   11.0
8  c.wav      3    8.0
9  c.wav      4    9.0
...