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

标签 python pandas

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

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/

相关文章:

python - 在 redis session 中保存静态文件(Python flask)

python - 父引用问题 python

python-3.x - 从另一个数据帧搜索(行值)数据

python - 列表到数据框,列中列表中的每个元素

python - 如何使用OPENCV有效地定位和保存具有特定值的像素?

python - cmd + a 在 tkinter 条目中不起作用

python从特定行位置的数据帧收集数据

python - 检查 Pandas 列值是否不在列表中

python - 为 Python (Windows) 正确安装 pyOpenSSL

python - 如何通过许多不同的 URL 获取唯一值