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

У меня есть список словарь, который называется данные, как показано ниже. Каждому ключу dict присваивается имя на основе строки, в которой перед _segX указывается имя, а segX указывает, из какого сегмента получены данные:

 {'o1_sp1_seg1.wav': array([ 0.        ,  1        ]),
  'o1_sp1_seg3.wav': array([2, 3,   0. ]),
  'o2_sp1_seg1.wav': array([6,7, 11, 8,   9 ])
  'o2_sp1_seg2.wav': array([6,3 ])
  'o2_sp1_seg5.wav': array([6,7, 9])
  'o5_sp1_seg3.wav': array([1, 6 ])
 }

количество элементов в каждом ключе, как правило, не одинаково Я хочу преобразовать его в фрейм данных следующего длинного формата: seg_orginal скопирует часть segX клавиши dict и seg_index отследит, какое количество сегментов является текущими данными .wav.

  name               value index   seg_index   seg_original
   o1_sp1_seg1.wav    0      1       1           seg1
   o1_sp1_seg1.wav    1      2       1           seg1
   o1_sp1_seg3.wav    2      3       2           seg3
   o1_sp1_seg3.wav    3      4       2           seg3
   o1_sp1_seg3.wav    0      5       2           seg3
   o2_sp1_seg1.wav    6      1       1           seg1
   o2_sp1_seg1.wav    7      2       1           seg1
   o2_sp1_seg1.wav    11     3       1           seg1
   o2_sp1_seg1.wav    8      4       1           seg1
   o2_sp1_seg1.wav    9      5       1           seg1
   o2_sp1_seg2.wav    6      6       2           seg2
   o2_sp1_seg2.wav    3      7       2           seg2
   o2_sp1_seg5.wav    6      8       3           seg5
   o2_sp1_seg5.wav    7      9       3           seg5
   o2_sp1_seg5.wav    9      10      3           seg5
   o5_sp1_seg3.wav    1      1       1           seg3
   o5_sp1_seg3.wav    6      2       1           seg3

Я знаю, как получить результат для первых трех столбцов, но чтобы получить столбцы seg_index и seg_original, я застрял.

1 Ответ

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

Данные:

import numpy as np 
import pandas as pd

data={'o1_sp1_seg1.wav': np.array([ 0.        ,  1        ]),
  'o1_sp1_seg3.wav': np.array([2, 3,   0. ]),
  'o2_sp1_seg1.wav': np.array([6,7, 11, 8,   9 ]),
  'o2_sp1_seg2.wav': np.array([6,3 ]),
  'o2_sp1_seg5.wav': np.array([6,7, 9]),
  'o5_sp1_seg3.wav': np.array([1, 6 ])
 }

Чтобы получить столбцы seg_index и seg_original, мы здесь отфильтровываем DataFrame на основе столбца name , используя встроенную функцию startsith. На основании которого мы увеличиваем его текущий индекс и вычисляем сегментированный индекс.

df=pd.DataFrame(columns=['name','value', 'index','seg_index','seg_original'])

for indx, key in enumerate(data):
    for val in data[key]:
        seg_original = key.split('_')[-1].split('.')[0]
        filtered_df = df[df['name'].apply(lambda x: x.startswith(key.split('_')[0]))]
        index = len(filtered_df)+1
        if index != 1: 
            curr_index = int(filtered_df['seg_index'].max(axis = 0))
            seg_index =  curr_index if seg_original in filtered_df['seg_original'].to_list() else curr_index+1  
        else:
           seg_index =1

        df.loc[len(df)] = [key,int(val),index,seg_index,seg_original]

Вывод:

+-----------------+---------+---------+-------------+----------------+
| name            |   value |   index |   seg_index | seg_original   |
|-----------------+---------+---------+-------------+----------------|
| o1_sp1_seg1.wav |       0 |       1 |           1 | seg1           |
| o1_sp1_seg1.wav |       1 |       2 |           1 | seg1           |
| o1_sp1_seg3.wav |       2 |       3 |           2 | seg3           |
| o1_sp1_seg3.wav |       3 |       4 |           2 | seg3           |
| o1_sp1_seg3.wav |       0 |       5 |           2 | seg3           |
| o2_sp1_seg1.wav |       6 |       1 |           1 | seg1           |
| o2_sp1_seg1.wav |       7 |       2 |           1 | seg1           |
| o2_sp1_seg1.wav |      11 |       3 |           1 | seg1           |
| o2_sp1_seg1.wav |       8 |       4 |           1 | seg1           |
| o2_sp1_seg1.wav |       9 |       5 |           1 | seg1           |
| o2_sp1_seg2.wav |       6 |       6 |           2 | seg2           |
| o2_sp1_seg2.wav |       3 |       7 |           2 | seg2           |
| o2_sp1_seg5.wav |       6 |       8 |           3 | seg5           |
| o2_sp1_seg5.wav |       7 |       9 |           3 | seg5           |
| o2_sp1_seg5.wav |       9 |      10 |           3 | seg5           |
| o5_sp1_seg3.wav |       1 |       1 |           1 | seg3           |
| o5_sp1_seg3.wav |       6 |       2 |           1 | seg3           |
+-----------------+---------+---------+-------------+----------------+
...