Pandas DataFrame排序忽略大小写

32

我在Python中有一个Pandas数据框。数据框的内容来自于这里。我稍微修改了“Single”列中第一个字母的大小写。以下是我的代码:

import pandas as pd
df = pd.read_csv('test.csv')
print df

Position                       Artist                  Single               Year     Weeks
       1                Frankie Laine               I Believe               1953  18 weeks
       2                  Bryan Adams         I Do It for You               1991  16 weeks
       3                  Wet Wet Wet      love Is All Around               1994  15 weeks
       4  Drake (feat. Wizkid & Kyla)               One Dance               2016  15 weeks
       5                        Queen       bohemian Rhapsody  1975/76 & 1991/92  14 weeks
       6                 Slim Whitman              Rose Marie               1955  11 weeks
       7              Whitney Houston  i Will Always Love You               1992  10 weeks

我想按照单一列进行升序排序(从a到z)。当我运行时:

df.sort_values(by='Single',inplace=True)

看起来排序无法将大小写字母组合在一起。这是我得到的结果:

Position                       Artist                  Single               Year     Weeks
       1                Frankie Laine               I Believe               1953  18 weeks
       2                  Bryan Adams         I Do It for You               1991  16 weeks
       4  Drake (feat. Wizkid & Kyla)               One Dance               2016  15 weeks
       6                 Slim Whitman              Rose Marie               1955  11 weeks
       5                        Queen       bohemian Rhapsody  1975/76 & 1991/92  14 weeks
       7              Whitney Houston  i Will Always Love You               1992  10 weeks
       3                  Wet Wet Wet      love Is All Around               1994  15 weeks

因此,它首先按大写字母排序,然后通过小写字母进行单独排序。我希望进行组合排序,不考虑Single列中起始字母的大小写。在排序后,“bohemian Rhapsody”所在的行位置不正确。它应该是第一个;而不是在排序后作为第5行出现。
是否有一种方法可以对Pandas DataFrame进行排序,同时忽略Single列文本的大小写?
4个回答

38

2
最佳答案。 - Mr. Lance E Sloan
@edesz 我不知道你是否可以更改所选的最佳答案,但现在应该是这样的。 - wordsforthewise

24
你可以将所有字符串转换为大写/小写,然后调用argsort()函数,该函数会给出索引值以按单个(忽略大小写)重新排序数据框:

你可以将所有字符串转换为大写/小写,然后调用argsort()函数,该函数会给出索引值以按单个(忽略大小写)重新排序数据框:

df.iloc[df.Single.str.lower().argsort()]

在此输入图片描述


太好了!谢谢。正是我想要的。 - edesz
1
这个关于使用 key 参数的其他答案更好:https://dev59.com/lVgR5IYBdhLWcg3wJ6pw#63141564 - Mr. Lance E Sloan

6

创建一个Single的副本,将所有字母都转换为大写,并按该列排序:

df["Single.Upper"] = df["Single"].str.upper()
df.sort_values(by="Single.Upper", inplace=True)

您可以稍后删除该列:
del df["Single.Upper"] 

谢谢。我本来想这么做,但不想创建新列。我曾尝试使用 by=df["Single"].str.upper(),但没有成功。有没有一种方法可以在不创建和删除额外列的情况下完成这个任务? - edesz
是的。请参考Psidom的答案。 - DYZ
哦,是的,我看到了答案。我在想是否可以在不创建和删除额外列的情况下完成转换为大写字母的选项(就像您所做的那样)。 - edesz
1
但他正在做的就是:将该列转换为大写并将其用于排序(实际上是用于置换索引)。 - DYZ
谢谢。之前错过了。好的,没有更多问题了。 - edesz

-1
创建新列,在排序时使用它,然后删除。
df["Single.Lower"] = df["Name"].str.lower()
df.sort_values(['Single.Lower'], axis=0, ascending=True, inplace=True)
del df["Single.Lower"]

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