Pandas 数据帧中的列排序/字母排序(熊猫)

Pandas 数据帧中的列排序/字母排序(熊猫),pandas,dataframe,alphabetical-sort,Pandas,Dataframe,Alphabetical Sort,我在对数据帧的第一列和第二列中的名称进行字母排序时遇到问题 数据帧的外观如下所示: Boys Females Rank 1 Michael Jennifer 2 Christopher Jessica 3 Matthew Amanda 4 Jason Sarah 5 David Melissa 6

我在对数据帧的第一列和第二列中的名称进行字母排序时遇到问题

数据帧的外观如下所示:

          Boys       Females
Rank                        
1         Michael   Jennifer
2     Christopher    Jessica
3         Matthew     Amanda
4           Jason      Sarah
5           David    Melissa
6          Joshua        Amy
7           James     Nicole
8            John  Stephanie
9          Robert  Elizabeth
10         Daniel    Heather
11         Joseph   Michelle
12         Justin    Rebecca
13           Ryan   Kimberly
14          Brian    Tiffany
我希望它看起来像这样:(男孩和女孩的名字按字母顺序排列)

我已经使用了sort和sort_值,但是列没有改变。这是我的原始代码

import pandas as pd



df = pd.read_html("file:///C:/Python27/babyname999.html")

df2 =df[0]  # creating a data frame from the above list of dateframes

df2.rename(columns = {'0': 'Rank', '1': 'Boys', '2': 'Females'}, inplace = True)
del df2['Unnamed: 0']

#renaming columns of dataframe


df2.set_index('Rank', inplace = True)  #setting index of dataframe to 'Rank'
我已经使用了sort和sort_值,但是列没有改变。我不知道在哪里。有什么建议吗


谢谢

下面是排序的工作示例

import pandas as pd
from io import StringIO

data_file = StringIO(u"""Rank       Boys       Females
1         Michael   Jennifer
2     Christopher    Jessica
3         Matthew     Amanda
4           Jason      Sarah
5           David    Melissa
6          Joshua        Amy
7           James     Nicole
8            John  Stephanie
9          Robert  Elizabeth
10         Daniel    Heather
11         Joseph   Michelle
12         Justin    Rebecca
13           Ryan   Kimberly
14          Brian    Tiffany""")

df = pd.read_table(data_file, delim_whitespace=True)

boys = df[['Rank','Boys']].sort_values(['Boys']).rename(columns={'Rank': 'Rank_boys'})
females = df[['Rank','Females']].sort_values(['Females']).rename(columns={'Rank': 'Rank_females'})
result = pd.concat([boys.reset_index(drop=True), females.reset_index(drop=True)], axis=1)
结果将是:

Rank_boys Boys Rank_females Females
0   14  Brian   3   Amanda
1   2   Christopher 6   Amy
2   10  Daniel  9   Elizabeth
3   5   David   10  Heather
4   7   James   1   Jennifer
5   4   Jason   2   Jessica
6   8   John    13  Kimberly
7   11  Joseph  5   Melissa
8   6   Joshua  11  Michelle
9   12  Justin  7   Nicole
10  3   Matthew 12  Rebecca
11  1   Michael 4   Sarah
12  9   Robert  8   Stephanie
13  13  Ryan    14  Tiffany
IIUC(这很难,因为你没有发布预期/期望的DF)你可以这样做:

df = (pd.read_html("file:///C:/Python27/babyname999.html")[0]
        .rename(columns = {'0': 'Rank', '1': 'Boys', '2': 'Females'})
        .drop('Unnamed: 0', 1)
        .set_index('Rank')
)
然后:


对数据帧的不同列进行独立排序的问题在于,pandas只会使用每个独立排序列的索引并重新对齐它们,从而破坏您的排序工作。相反,您必须排序并返回结果排序序列的值。。。说得够多了,举个例子就能解释更多

假设
df
是您的示例数据帧。然后

df.apply(lambda x: x.sort_values().values)


为了得到接近你要求的东西

lst = [df[c].sort_values().reset_index(name='Name') for c in df]
keys = df.columns
pd.concat(lst, axis=1, keys=keys)

你能发布你想要的数据集吗,因为不清楚你想要实现什么?嗨,很抱歉给你带来困惑。对于男孩专栏,我希望看到布赖恩首先,然后让列表以字母顺序继续,以罗伯特结尾。对于女性专栏,我希望艾米排在首位,让列表以字母顺序继续。我想要男孩和女孩同时按字母顺序排列。至于排名,我希望排名跟在名字后面。因此,即使在排序之后,米迦勒将在列表中的某个位置,他仍然保留排名“1”。因此,我需要另一个排名栏的女性字母版本,我刚刚意识到。现在有意义了吗?抱歉搞混了。你能简单地说出你想要的排序DF吗?因为我还不清楚。抱歉,我编辑了它。是的,这是我同时为男孩和女性专栏做的。我将查看您的代码,看看是否有任何问题。谢谢。在看过你的代码之后,我似乎还需要为女性创建另一个排名栏。我不熟悉StringIO模块,因此我必须阅读它。StringIO只是从您问题中的数据示例创建一个数据帧。好的,我已经编辑了答案,我认为这就是您想要的。谢谢。我将慢慢地看一看你的代码,看看是否还有其他问题。这太完美了。我会看看你的代码,看看是否还有其他问题。哇,你让代码的第一部分变得如此高效。df=(pd.read_html(“file:///C:/Python27/babyname999.html“”[0]。重命名(列={'0':'Rank','1':'Boys','2':'Females'})。删除('Unnamed:0',1)。设置索引('Rank'))我注意到您在删除列时使用了“drop”而不是“del”。我应该知道有什么区别吗?我不明白第二个参数1在drop中的作用。删除('未命名:0',1)谢谢!
df.apply(lambda x: x.sort_values().values)
lst = [df[c].sort_values().reset_index(name='Name') for c in df]
keys = df.columns
pd.concat(lst, axis=1, keys=keys)