python - 根据列名中的子字符串堆叠数据

标签 python pandas dataframe

我对 Python 和 Pandas 有点陌生,我不明白如何根据部分列名来堆叠数据。

我的数据如下所示:(示例数据的一部分)

<表类=“s-表”> <标题> ID 地区 代表 Item_Loop1 Units_A_Loop1 Type_col_X_Loop1 Unit_Cost_Type_New_Loop1xyz Total_Loop1ABCD Item_Loop2 Units_A_Loop2 Type_col_X_Loop2 Unit_Cost_Type_New_Loop2xyz Total_Loop2ABCD <正文> 1 中环 安德鲁斯 铅笔 75 一个 1,99 149,25 铅笔 66 问 1,99 131,34 4 中环 怡和 笔组 50 C 4,99 249,5 笔组 50 V 4,99 249,5 5 东 琼斯 铅笔 95 B 1,99 189,05 Binder 60 一个 4,99 299,4 6 中环 基维尔 Binder 50 X 19,99 999,5 笔组 96 G 4,99 479,04

除了前 3 列(ID、Region、Rep)外,所有其他列都包含相同的子字符串“Loop”以及循环数,例如循环1、循环2、循环3 --> Item_Loop1、Item_Loop2、Item_Loop3

我需要将这个数据更改为按ID堆叠的数据。例如,对于 ID = 1,每个循环将有 2 个额外行:

<表类=“s-表”> <标题> ID 地区 代表 循环 项目_ 单位_A_ Type_col_X_ Unit_Cost_Type_New_xyz 总计_ABCD <正文> 1 中环 安德鲁斯 循环1 铅笔 75 一个 1,99 149,25 1 中环 安德鲁斯 循环2 铅笔 66 问 1,99 131,34 1 中环 安德鲁斯 循环3 铅笔 14 X 1,29 18,06 4 中环 怡和 循环1 笔组 50 C 4,99 249,5 4 中环 怡和 循环2 笔组 50 V 4,99 249,5 4 中环 怡和 循环3 Binder 11 是 4,99 54,89 5 东 琼斯 循环1 铅笔 95 B 1,99 189,05 5 东 琼斯 循环2 Binder 60 一个 4,99 299,4 5 东 琼斯 循环3 铅笔 35 问 4,99 174,65 5 东 琼斯 循环4 笔组 16 一个 15,99 255,84 5 东 琼斯 循环5 Binder 60 G 8,99 539,4

我尝试用_分割列并将其与“循环”堆叠在一起。我发现的问题是我的列中有多个 _ ,并且在“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/

相关文章:

python - 增加 pygame 中使用的变量

python请求对url进行编码

python - 用 Pandas 分块将唯一行写入 CSV

Python 和 Pandas - 使用相同的中断删除多个文件中的页脚

r - 如何将多列连接成一列并删除重复项?

python - 仅在特定时间合并两个数据帧

python - 从按多列分组的 pandas 数据框中获取嵌套 JSON

python - 当另一列增加/减少时添加状态列

用另一个 data.frame 的值替换 data.frame 的列中的值

python函数将短信语言转换为英语?