我有一个数据帧df1的形式:
ID V1 V2 V3 V4
1 4 0.1 0.2 0.3
2 6 0.4 0.5 0.6
3 3 0.7 0.8 0.9
4 11 1.0 1.1 1.2
5 6 1.3 1.4 1.5
我想安排ID列为奇数的行,首先显示在顶部,然后在末尾显示偶数ID值。
说明性地,我想以下列格式重新排列df1:
ID V1 V2 V3 V4
1 4 0.1 0.2 0.3
3 3 0.7 0.8 0.9
5 6 1.3 1.4 1.5
2 6 0.4 0.5 0.6
4 11 1.0 1.1 1.2
任何人都可以请我指出实现这一目标的最佳方式吗?
编辑/ UPDATE
我之前使用ID列作为groupby()变量。我注意到,当我输出数据帧时,ID varilable技术上不再是数据框中的列。我想在ID上使用groupby后在数据帧上执行上述功能。如何将已经“groupby-ed”的ID列转换为数据框中的常规列?
谢谢。
根据OP的评论,“ID”需要在排序之前首先转换回列,请尝试:
df.reset_index(inplace=True)
然后我的原始解决方案应该工作,如下所示:
一种方法是使用临时列,告诉您行是奇数还是偶数:
df['odd_even'] = df['ID'] % 2 # result is 1 for odd IDs, 0 for even
df.sort_values(by=['odd_even', 'ID'], ascending=[False, True], inplace=True)
df.drop('odd_even', axis=1, inplace=True)
ID V1 V2 V3 V4
0 1 4 0.1 0.2 0.3
2 3 3 0.7 0.8 0.9
4 5 6 1.3 1.4 1.5
1 2 6 0.4 0.5 0.6
3 4 11 1.0 1.1 1.2
这是一种方法(我没有复制你的所有列,只是为了让它更短):
In [1]: df.loc[np.argsort(df.ID % 2 == 0)]
Out[1]:
ID V1
0 1 4
2 3 3
4 5 6
1 2 6
3 4 11