我对 Python 和 Pandas 有点陌生,我不明白如何根据部分列名来堆叠数据。
我的数据如下所示:(示例数据的一部分)
除了前 3 列(ID、Region、Rep)外,所有其他列都包含相同的子字符串“Loop”以及循环数,例如循环1、循环2、循环3 --> Item_Loop1、Item_Loop2、Item_Loop3
我需要将这个数据更改为按ID堆叠的数据。例如,对于 ID = 1,每个循环将有 2 个额外行:
我尝试用_分割列并将其与“循环”堆叠在一起。我发现的问题是我的列中有多个 _ ,并且在“loopX”之后有附加文本。我尝试使用 rfind
来切片列名/slice
,但我无法执行合理的结果。
我的总体想法或多或少是:
df.columns = df.columns.str.split('_', expand=True)
#I've tried to use rfind and slicing column name to -> find index of last '_' and get 5 next characters, but I couldn't execute it without errors
df = df.stack(dropna=False).rename_axis(['ID','Region','Rep','Loop']).reset_index()
我也不确定为什么在预览表中看起来不错,但发布后却不然:(
最佳答案
标准化列名称,使每个列名称以前缀 LoopN_
开头,然后拆分并展开分隔符 _
周围的列名称以创建多重索引列,然后在 level=0
上堆叠
框架以 reshape 形状
df = df.set_index(["ID", 'Region', 'Rep'])
df.columns = df.columns.str.replace(r'(.*)(Loop\d+)(.*)', r'\2_\1\3')\
.str.split('_', n=1, expand=True)
df = df.stack(0)
Item_ Total_ABCD Type_col_X_ Unit_Cost_Type_New_xyz Units_A_
ID Region Rep
1 Central Andrews Loop1 Pencil 149,25 A 1,99 75
Loop2 Pencil 131,34 Q 1,99 66
4 Central Jardine Loop1 Pen Set 249,5 C 4,99 50
Loop2 Pen Set 249,5 V 4,99 50
5 East Jones Loop1 Pencil 189,05 B 1,99 95
Loop2 Binder 299,4 A 4,99 60
6 Central Kivell Loop1 Binder 999,5 X 19,99 50
Loop2 Pen Set 479,04 G 4,99 96
关于python - 根据列名中的子字符串堆叠数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68699181/