Pandas:基于列的值对行进行排序

5

I have a dataframe df like this :

ID    NAME    AGE
-----------------
M43   ab      32
M32   df      12
M54   gh      34
M43   ab      98
M43   ab      36
M43   cd      32
M32   cd      39
M43   ab      67

我需要根据ID列对行进行排序。
输出的df_grouped应该是这样的:
ID    NAME    AGE
-----------------
M43   ab      32
M43   ab      98
M43   ab      36
M43   cd      32
M43   ab      67
M32   df      12
M32   cd      39
M54   gh      34

我尝试了这样的方法:
df_grouped = df.group_by(df.ID)

for id in list(df.ID.unique()):
   grouped_df_list.append(df_grouped.get_group(id))

有没有更好的方法来做这件事?

3
看起来不像是分组 - 更像是排序... 不是你想要的吗?df.sort_values('ID') - Jon Clements
@deadbug,将这6个元素分组并将它们附加到新框架中与仅仅按键排序使它们在一起有何不同?我不太明白... - Jon Clements
@JonClements,现在有意义了吗? - deadbug
2
你想要将具有相同ID的行相邻放置,但保留它们最初出现在框架中的顺序,是吗?如果是这样的话 - 你的代码示例更有意义 - 只是样本数据选择相当差,并且缺乏解释 :) - Jon Clements
1
@deadbug 你可以直接在 ID 上使用 sort_values。试一下。 - Tai
显示剩余5条评论
2个回答

7
您可以使用pd.DataFrame.sort_values来按多列进行排序:
df = df.sort_values(['ID', 'NAME'])

默认情况下,参数ascending被设置为True


1
你可以使用 pd.factorize 将关键字转换为唯一数字,表示其出现的顺序,然后将其 argsort 以获取要索引到框架中的位置,例如:

给定:

     0   1   2
0  M43  ab  32
1  M32  df  12
2  M54  gh  34
3  M43  ab  98
4  M43  ab  36
5  M43  cd  32
6  M32  cd  39
7  M43  ab  67

然后:

new_df = df.loc[pd.factorize(df[0])[0].argsort()]
# might want to consider df.reindex() instead depending...

你得到:

     0   1   2
0  M43  ab  32
3  M43  ab  98
4  M43  ab  36
5  M43  cd  32
7  M43  ab  67
1  M32  df  12
6  M32  cd  39
2  M54  gh  34

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接