按包含重复值的顺序对pandas数据框列进行排序

8fq7wneg  于 2023-03-21  发布在  其他
关注(0)|答案(2)|浏览(109)

我在下面制作了一个示例 Dataframe 。

import pandas as pd

col1=['1M','1M','1M','1M','1M','1M','1M','1M','1M','1M','1M','1M']

col11=['2M','2M','2M','2M','2M','2M','2M','2M','2M','2M','2M','2M']

col111=['3M','3M','3M','3M','3M','3M','3M','3M','3M','3M','3M','3M']    

col1111=['4M','4M','4M','4M','4M','4M','4M','4M','4M','4M','4M','4M']

final_col1=col1+col11+col111+col1111

#col2=['1M','2M','3M','4M','5M','6M','7M','8M','9M','10M','11M','12M']

col2=['1M','2M','3M','4M']

final_col2=12*col2
col22=['1M','2M','3M','4M']

col23=['1M','2M','3M','4M']


df1=pd.DataFrame()

df1['col1']=final_col1

df1['col2']=final_col2

我想对dataframe进行排序,以便'col1'和'col2'的顺序互换。真实的数据有超过100万行和其他列,所以我不能只互换'col1'和'col2'。提前感谢您。
df3是预期输出:

df2=pd.DataFrame()


df2['col2']=final_col1

df2['col1']=final_col2

cols=['col1','col2']
df3=df2[cols]

添加样本输入数据和输出数据。输入数据

col1 col2  data
0    1M   1M     1
1    1M   2M     2
2    1M   3M     3
3    1M   4M     4
4    1M   1M     5
5    1M   2M     6
6    1M   3M     7
7    1M   4M     8
8    1M   1M     9
9    1M   2M    10
10   1M   3M    11
11   1M   4M    12
12   2M   1M    13

输出数据:

col1 col2  data
0   1M   1M     1
1   2M   1M    13
ojsjcaue

ojsjcaue1#

如果我理解正确的话,您希望根据col2的顺序对col1的值进行排序。
假设您需要将col2的确切顺序与重复项的顺序相匹配,请使用merge重新索引行:

order = (
 df1[['col2']]
    .assign(n=lambda d: d.groupby('col2').cumcount())
    .merge(df1[['col1']].reset_index().assign(n=lambda d: d.groupby('col1').cumcount()),
           left_on=['col2', 'n'], right_on=['col1', 'n'], how='left'
           )
     ['index']
)

out = df1.loc[order]

输出:

col1 col2
0    1M   1M
12   2M   1M
24   3M   1M
36   4M   1M
1    1M   2M
13   2M   2M
25   3M   2M
37   4M   2M
2    1M   3M
14   2M   3M
26   3M   3M
38   4M   3M
3    1M   4M
15   2M   4M
27   3M   4M
39   4M   4M
4    1M   1M
16   2M   1M
28   3M   1M
40   4M   1M
5    1M   2M
17   2M   2M
29   3M   2M
41   4M   2M
6    1M   3M
18   2M   3M
30   3M   3M
42   4M   3M
7    1M   4M
19   2M   4M
31   3M   4M
43   4M   4M
8    1M   1M
20   2M   1M
32   3M   1M
44   4M   1M
9    1M   2M
21   2M   2M
33   3M   2M
45   4M   2M
10   1M   3M
22   2M   3M
34   3M   3M
46   4M   3M
11   1M   4M
23   2M   4M
35   3M   4M
47   4M   4M
bf1o4zei

bf1o4zei2#

要在pandas DataFrame中交换列的顺序,可以使用索引运算符[]并按所需的顺序传递列。
下面是您可以如何做到这一点:

# create a copy of the original dataframe
df2 = df1.copy()

# interchange the columns
df2 = df2[['col2', 'col1']]

上面的代码创建了原始 Dataframe df1的一个副本,然后将列名['col2','col1']的列表传递给索引操作符[]。这将创建一个新的 Dataframe df2,其中列col2和col1按所需的顺序排列。
你也可以把上面的代码串在一行中:

df2 = df1[['col2', 'col1']].copy()

这将直接从df1中选择所需的列,并创建结果 Dataframe 的副本,其中列被互换。
在任一情况下,所得到的 Dataframe df2将具有按期望顺序的列col2和col1。

相关问题