重新排列数据框的行

时间:2018-12-13 19:55:36

标签: python pandas sorting dataframe indexing

我有一个像这样的数据框:

df = pd.DataFrame({'col1': [i+1 for i in range(10)] + [-i-1 for i in range(10)],
                   'col2': ['random string'] *20})
print(df)
    col1           col2
0      1  random string
1      2  random string
2      3  random string
3      4  random string
4      5  random string
5      6  random string
6      7  random string
7      8  random string
8      9  random string
9     10  random string
10    -1  random string
11    -2  random string
12    -3  random string
13    -4  random string
14    -5  random string
15    -6  random string
16    -7  random string
17    -8  random string
18    -9  random string
19   -10  random string

我想使它看起来像这样:

   col1           col2
0     1  random string
1    -1  random string
2     2  random string
3    -2  random string
4     3  random string
5    -3  random string
6     4  random string
7    -4  random string
8     5  random string
9    -5  random string
10    6  random string
11   -6  random string
12    7  random string
13   -7  random string
14    8  random string
15   -8  random string
16    9  random string
17   -9  random string
18   10  random string
19  -10  random string

我自己的方法似乎要花费很多行,也就是不是pythonic。我的代码:

df2 = pd.DataFrame(index = df.index,columns = df.columns)

Ypos = df[df['col1'] > 0]
Yneg = df[df['col1'] < 0]

ind_pos = [2*i for i in range(10)]
ind_neg = [2*i+1 for i in range(10)]

df2.loc[ind_pos] = Ypos.rename({k:v for k,v in zip(Ypos.index, ind_pos)})
df2.loc[ind_neg] = Yneg.rename({k:v for k,v in zip(Yneg.index, ind_neg)})
print(df2)

是否还有其他pythonic方式可以达到相同的结果?预先谢谢你。

编辑:我想要一个更通用的方法来处理像这样的数据框

   col1           col2
0     1  random string
1     2  random string
2     3  random string
3     4  random string
4     5  random string
5    1x  random string
6    2x  random string
7    3x  random string
8    4x  random string
9    5x  random string
10   1y  random string
11   2y  random string
12   3y  random string
13   4y  random string
14   5y  random string

2 个答案:

答案 0 :(得分:2)

使用abs创建帮助键后排序

newdf=df.assign(key=df.col1.abs()).sort_values('key').drop('key',1)
newdf
Out[60]: 
    col1           col2
0      1  random string
10    -1  random string
1      2  random string
11    -2  random string
2      3  random string
12    -3  random string
3      4  random string
13    -4  random string
4      5  random string
14    -5  random string
5      6  random string
15    -6  random string
6      7  random string
16    -7  random string
17    -8  random string
7      8  random string
18    -9  random string
8      9  random string
9     10  random string
19   -10  random string

答案 1 :(得分:1)

如果知道子组的大小,我们将其称为n,而您的DataFrame与每个组紧随其后,我们只需要一些数学运算即可:

n=5

df.index = df.index%n + (df.index//n)/(len(df)/n)
df = df.sort_index().reset_index(drop=True)

输出:

   col1           col2
0     1  random_string
1    1x  random_string
2    1y  random_string
3     2  random_string
4    2x  random_string
5    2y  random_string
6     3  random_string
7    3x  random_string
8    3y  random_string
9     4  random_string
10   4x  random_string
11   4y  random_string
12    5  random_string
13   5x  random_string
14   5y  random_string