将系列索引(模式匹配)转换为数据框列

我有一个系列(索引如图所示)显示为


E1         543

Units1_E   100

E2         553

Units2_E   420

E3         513

Units3_E   110

F1         243

Units1_F   500

F2         450

Units2_F   300

F3         400

Units3_F   200

我希望将其转换为数据框,以便输出为


 E_F     Units

 543     100

 553     420

 513     110

 243     500

 450     300

 400     200

所以所需的输出更像是一对值列。我不确定如何有效地完成此操作,我正在考虑使用正则表达式来过滤系列索引?


慕森卡
浏览 210回答 3
3回答

MM们

MultiIndex如果有必要,可以通过整数除法和对数组取模来创建 Series 中的匹配对和非对值,长度为Series,整形为Series.unstack:arr = np.arange(len(s))s.index = [arr// 2, arr % 2]df = s.unstack()df.columns = ['E_F','Units']print (df)   E_F  Units0  543    1001  553    4202  513    1103  243    5004  450    3005  400    200或者通过索引创建新的 DataFrame - 配对和取消配对值:#pandas 0.24+a = s.to_numpy()#pandas below#a = s.valuesdf = pd.DataFrame({'E_F':a[::2], 'Units':a[1::2]})print (df)   E_F  Units0  543    1001  553    4202  513    1103  243    5004  450    3005  400    200另一个想法(像第一个 2 一样慢)是测试 index 的第一个值是否为Eor F、 createSeries和MultiIndexby GroupBy.cumcount:idx = pd.Series(np.where(s.index.str[0].isin(['E','F']), 'E_F','Units'))s.index = [idx.groupby(idx).cumcount(), idx]df = s.unstack()print (df)   E_F  Units0  543    1001  553    4202  513    1103  243    5004  450    3005  400    200

桃花长相依

我使用zip并s构建s.shift数据框并reindex仅选择奇数行:pd.DataFrame(list(zip(s.shift(), s)), columns=['E_F', 'Units']).reindex(index=range(1,s.size,2))Out[225]:      E_F  Units1   543.0    1003   553.0    4205   513.0    1107   243.0    5009   450.0    30011  400.0    200

RISEBY

使用此代码:>>> df = pd.DataFrame({i: pd.Series(x.values.ravel())                       for i, x in pd.DataFrame(s).T.groupby(lambda x: x[0] in ['E', 'F'], axis=1)})>>> df.columns = ['E_F', 'Units']>>> df   E_F  Units0  100    5431  420    5532  110    5133  500    2434  300    4505  200    400>>> 
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python