Python 对df.columns进行重新排序
我的df如下所示:Python 对df.columns进行重新排序,python,pandas,sorting,Python,Pandas,Sorting,我的df如下所示: Store Spend_1 Spend_2 Spend_3 Spend_4 Variance_1 Variance_2 Variance_3 Variance_4 0 1 200 230 189 200 -14 16 -6 18 1 2 224 104 240 203 -17 -11 17 -18 2 3 220 168 131 210 10 -9 12 19 3 4 143 187 139 188 -1
Store Spend_1 Spend_2 Spend_3 Spend_4 Variance_1 Variance_2 Variance_3 Variance_4
0 1 200 230 189 200 -14 16 -6 18
1 2 224 104 240 203 -17 -11 17 -18
2 3 220 168 131 210 10 -9 12 19
3 4 143 187 139 188 -1 -17 -20 -9
4 5 179 121 162 131 6 -25 5 20
5 6 208 158 140 191 16 -14 -22 -6
我正在尝试对列名应用自定义排序,以便对其进行排序:
Store Spend_1 Variance_1 Spend_2 Variance_2 Spend_3 Variance_3 Spend_4 Variance_4
0 1 200 -14 230 16 189 -6 200 18
1 2 224 -17 104 -11 240 17 203 -18
2 3 220 10 168 -9 131 12 210 19
3 4 143 -1 187 -17 139 -20 188 -9
4 5 179 6 121 -25 162 5 131 20
5 6 208 16 158 -14 140 -22 191 -6
我尝试过简单的排序,但显然这是按字母顺序排列的,忽略了结尾的整数
我曾经尝试过以数字形式枚举,cols df.columns,将字符串更改为int,应用排序,然后在iloc中使用数字,但我不确定如何以这种方式应用自定义排序
有人能帮忙吗 想法是通过2个值使用关键参数-将u后的值转换为在u之前具有第一个值的inetegrs,但解决方案是应用于所有没有带df.columns[1:]的第一列的列,因此最后一个由df.columns[:1]添加到第一列。列表:
您可以将密钥传递给sorted,以执行自己的自定义排序:
sorted_columns = sorted(df.columns, key = lambda col: col[-1] + col[:-1])
df[sorted_columns]
想法是把最后的整数放在第一位。如果您可以使用两位数,则会出现这种情况。这里有一种方法,将u上的列拆分,将生成的列表反转,以便进一步对后面的数字排序,并使用:
我能想到的最简单的方法就是定义自己的排序键
df = df.reindex(sorted(df.columns, key=lambda x: int(x.split("_")[1]) if "_" in x else 0), axis=1)
把钥匙递给我?也许像lambda col:col[-1]+col[:-1]@Dan这样的东西让我非常接近,我如何在不丢失原始列名的情况下将这种排序应用到我的列中我想我可以在另一行代码中将存储列转移到其他地方谢谢Dan,我喜欢你的解决方案,因为它的可读性比下面的要高一点,但它将存储放在最后一列中!谢谢你教我一些新东西,非常感谢!拆分的想法更具普遍性,因为它可以处理两位数。我在这里看到的问题是,如果列结尾的位数大于9,它将失败,否则这是一个很好的方法!
df.iloc[:,[0]+[*df.columns.str.split('_').str[::-1].argsort()[:-1]]]
Store Spend_1 Variance_1 Spend_2 Variance_2 Spend_3 Variance_3 \
0 1 200 -14 230 16 189 -6
1 2 224 -17 104 -11 240 17
2 3 220 10 168 -9 131 12
3 4 143 -1 187 -17 139 -20
4 5 179 6 121 -25 162 5
5 6 208 16 158 -14 140 -22
Spend_4 Variance_4
0 200 18
1 203 -18
2 210 19
3 188 -9
4 131 20
5 191 -6
df = df.reindex(sorted(df.columns, key=lambda x: int(x.split("_")[1]) if "_" in x else 0), axis=1)