为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕森卡 2022-03-09 21:28:24
我有一个系列(索引如图所示)显示为E1         543Units1_E   100E2         553Units2_E   420E3         513Units3_E   110F1         243Units1_F   500F2         450Units2_F   300F3         400Units3_F   200我希望将其转换为数据框,以便输出为 E_F     Units 543     100 553     420 513     110 243     500 450     300 400     200所以所需的输出更像是一对值列。我不确定如何有效地完成此操作,我正在考虑使用正则表达式来过滤系列索引?
查看完整描述

3 回答

?
MM们

TA贡献1886条经验 获得超2个赞

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  Units

0  543    100

1  553    420

2  513    110

3  243    500

4  450    300

5  400    200

或者通过索引创建新的 DataFrame - 配对和取消配对值:


#pandas 0.24+

a = s.to_numpy()

#pandas below

#a = s.values

df = pd.DataFrame({'E_F':a[::2], 'Units':a[1::2]})

print (df)

   E_F  Units

0  543    100

1  553    420

2  513    110

3  243    500

4  450    300

5  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  Units

0  543    100

1  553    420

2  513    110

3  243    500

4  450    300

5  400    200


查看完整回答
反对 回复 2022-03-09
?
桃花长相依

TA贡献1860条经验 获得超8个赞

我使用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  Units

1   543.0    100

3   553.0    420

5   513.0    110

7   243.0    500

9   450.0    300

11  400.0    200


查看完整回答
反对 回复 2022-03-09
?
RISEBY

TA贡献1856条经验 获得超5个赞

使用此代码:


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

0  100    543

1  420    553

2  110    513

3  500    243

4  300    450

5  200    400

>>> 


查看完整回答
反对 回复 2022-03-09
  • 3 回答
  • 0 关注
  • 209 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信