重新排列数据框的行

数学家

我有一个数据框看起来像这样:

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
洛兹

如果知道子组的大小,我们称它为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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章