在Pandas Dataframe中将旧列转换为新列

时间:2018-09-26 08:55:00

标签: python-3.x pandas

我有一个看起来像这样的数据集

time channel  min    sd   mag.   frequency  
12:00   X     12.0   2.3  x11     fx11  
12:00   X     12.0   2.3  x12     fx12  
12:00   X     12.0   2.3  x13     fx13  
12:00   X     12.0   2.3  x14     fx14  
12:00   X     12.0   2.3  x15     fx15  
12:00   Y     17.0   2.7  y11     fy11  
12:00   Y     17.0   2.7  y12     fy12  
12:00   Y     17.0   2.7  y13     fy13  
12:00   Y     17.0   2.7  y14     fy14  
12:00   Y     17.0   2.7  y15     fy15  
12:00   Z     15.0   4.3  z11     fz11  
12:00   Z     15.0   4.3  z12     fz12  
12:00   Z     15.0   4.3  z13     fz13  
12:00   Z     15.0   4.3  z14     fz14  
12:00   Z     15.0   4.3  z15     fz15  
12:01   X     13.0   4.9  x21     fx21  
....     ...   ...   ...  ...     .....  
....  .....   ....  ...  ....  .....  .... 

如您所见,对于X,Y,Z通道,有“ time”,“ min”和“ sd”之类的条目重复5次,但重复了“ mag”。和“频率”每次都在变化。该数据集的形状为(740231,6),其中通道X,Y,Z的这15行按我上面的描述不断重复。

我想摆脱这种重复,并想像这样转换此数据集:

  time channel min  sd   m1  f1    m2 f2   m3   f3   m4  f4    m5  f5    
  12:00   X    12.0 2.3  x11 fx11 x12 fx12 x13 fx13 x14  fx14  x15 fx15  
  12:00   Y    17.0 2.7  y11 fy11 y12 fy12 y13 fy13 y14  fy14  y15 fy15  
  12:00   Y    15.0 4.3  z11 fz11 z12 fz12 z13 fz13 z14  fz14  z15 fz15  
  12:01   X    13.0 4.9  x21 fx21 x22 fx22 x23 fx23 x24  fx24  x25 fx25  
  ....   ...    .....   ...  ....  ..... ....  .....  ....  .... ....  
.... .....  ....  ....  ....  ...  ....  .....  ....  ....  ...  ...  ... 

这意味着现在将15行x 6列的值转换为3行x 14列。

任何建议都值得赞赏。非常感谢您的宝贵时间。

最好的问候, 便服

1 个答案:

答案 0 :(得分:1)

如果应该交换输出列的顺序-首先f,然后m列:

cols = ['time','channel','min', 'sd']
d = {'frequency':'f','mag.':'m'}
g = df.groupby(cols).cumcount().add(1).astype(str)
df = df.rename(columns=d).set_index(cols + [g]).unstack().sort_index(axis=1, level=1)
df.columns = df.columns.map(''.join)
df = df.reset_index()
print (df)
    time channel   min   sd    f1   m1    f2   m2    f3   m3    f4   m4    f5  \
0  12:00       X  12.0  2.3  fx11  x11  fx12  x12  fx13  x13  fx14  x14  fx15   
1  12:00       Y  17.0  2.7  fy11  y11  fy12  y12  fy13  y13  fy14  y14  fy15   
2  12:00       Z  15.0  4.3  fz11  z11  fz12  z12  fz13  z13  fz14  z14  fz15   
3  12:01       X  13.0  4.9  fx21  x21   NaN  NaN   NaN  NaN   NaN  NaN   NaN   

    m5  
0  x15  
1  y15  
2  z15  
3  NaN  

说明

  1. renamedictionary
  2. 然后由set_index创建的计数器Series cumcount加上1并转换为strings
  3. unstack重塑
  4. sort_index之前MultiIndex的第二级
  5. mapjoin铺平MultiIndex列
  6. index中列的最后reset_index

如果输出列的排序很重要,则可以使用双rename列:

cols = ['time','channel','min', 'sd']
d = {'frequency':2,'mag.':1}

g = df.groupby(cols).cumcount().add(1).astype(str)
df = (df.rename(columns=d)
        .set_index(cols + [g])
        .unstack()
        .sort_index(axis=1, level=1)
        .rename(columns={2:'f', 1:'m'}))

df.columns = df.columns.map(''.join)
df = df.reset_index()
print (df)
    time channel   min   sd   m1    f1   m2    f2   m3    f3   m4    f4   m5  \
0  12:00       X  12.0  2.3  x11  fx11  x12  fx12  x13  fx13  x14  fx14  x15   
1  12:00       Y  17.0  2.7  y11  fy11  y12  fy12  y13  fy13  y14  fy14  y15   
2  12:00       Z  15.0  4.3  z11  fz11  z12  fz12  z13  fz13  z14  fz14  z15   
3  12:01       X  13.0  4.9  x21  fx21  NaN   NaN  NaN   NaN  NaN   NaN  NaN   

     f5  
0  fx15  
1  fy15  
2  fz15  
3   NaN