我有一个系列(索引如图所示)显示为
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
因此所需的输出更像是一个对值列.. 我不确定如何有效地完成此操作,是否正在考虑使用正则表达式来过滤系列索引?
最佳答案
如果有必要,可以通过整数除法和长度为 Series
的数组取模创建 MultiIndex
,并通过 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 一样慢)是测试索引的第一个值是 E
还是 F
,创建 Series
和 MultiIndex
作者 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
关于python - 将系列索引(匹配模式)转换为数据框列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56642021/