【问题标题】:python pandas: convert a dict to a long-format with counts based on different values of a string variablepython pandas:将字典转换为长格式,计数基于字符串变量的不同值
【发布时间】:2020-02-10 04:07:24
【问题描述】:

我有一个字典列表,称为数据,如下所示。 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 将复制 dict 键的 segX 部分, 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 列,我就卡住了。

【问题讨论】:

    标签: python pandas data-manipulation


    【解决方案1】:

    数据:

    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 列,我们在这里使用startswith inbuit 函数根据name 列过滤掉DataFrame。基于此,我们正在增加其当前索引并计算分段索引。

    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           |
    +-----------------+---------+---------+-------------+----------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-21
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      • 2019-01-08
      • 1970-01-01
      相关资源
      最近更新 更多