Python 3.4 - Pandas - 根据Dataframe的一列值重新排列行

问题描述 投票:0回答:2

我有一个数据帧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列转换为数据框中的常规列?

谢谢。

python python-3.x pandas dataframe
2个回答
0
投票

根据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

1
投票

这是一种方法(我没有复制你的所有列,只是为了让它更短):

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
© www.soinside.com 2019 - 2024. All rights reserved.