3 回答
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
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
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
>>>
添加回答
举报