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)