我有一个看起来像这样的数据集
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列。
任何建议都值得赞赏。非常感谢您的宝贵时间。
最好的问候, 便服
答案 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
说明:
rename
前dictionary
列set_index
创建的计数器Series
cumcount
加上1
并转换为strings
unstack
重塑sort_index
之前MultiIndex
的第二级map
和join
铺平MultiIndex列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