Python 按索引对系列进行排序
我有一个名为Python 按索引对系列进行排序,python,pandas,sorting,Python,Pandas,Sorting,我有一个名为pd的Pandas数据帧,我使用以下命令提取此数据帧的一列中唯一值的数量: b = df.groupby('Region').size() b是熊猫系列对象,如下所示: In [48]: b Out[48]: Region 0 8 1 25 11 1 2 41 3 23 4 15 5 35 6 24 7 27 8 50
pd
的Pandas数据帧,我使用以下命令提取此数据帧的一列中唯一值的数量:
b = df.groupby('Region').size()
b是熊猫系列对象,如下所示:
In [48]: b
Out[48]:
Region
0 8
1 25
11 1
2 41
3 23
4 15
5 35
6 24
7 27
8 50
9 55
N 10
我正在尝试绘制本系列的条形图,但是,我想首先根据第一列对其进行排序(因为1和2之间有11列),这将是x轴标签。我尝试传递sort命令,但它根据第二列中的值对序列进行排序:
b.sort()
In [48]: b
Out[54]:
Region
11 1
0 8
N 10
4 15
3 23
6 24
1 25
7 27
5 35
2 41
8 50
9 55
那么,有没有办法根据第一列对本系列进行排序?您正在寻找:
只有一列值。第一列是索引。 按索引排序
In [10]: s.sort_index()
Out[10]:
1 3
2 1
3 2
dtype: int64
按值排序
In [11]: s.sort_values()
Out[11]:
2 1
3 2
1 3
dtype: int64
您需要将索引转换为对象索引,因为它当前按字典顺序排序,而不是按数字排序:
In [97]: s = read_clipboard(header=None)
In [98]: news = s.rename(columns=lambda x: ['Region', 'data'][x])
In [99]: news
Out[99]:
Region data
0 0 8
1 1 25
2 11 1
3 2 41
4 3 23
5 4 15
6 5 35
7 6 24
8 7 27
9 8 50
10 9 55
11 N 10
In [100]: news_converted = news.convert_objects(convert_numeric=True)
In [101]: news_converted
Out[101]:
Region data
0 0 8
1 1 25
2 11 1
3 2 41
4 3 23
5 4 15
6 5 35
7 6 24
8 7 27
9 8 50
10 9 55
11 NaN 10
In [102]: news_converted.loc[11, 'Region'] = 'N'
In [103]: news_converted_with_index = news_converted.set_index('Region')
In [104]: news_converted_with_index
Out[104]:
data
Region
0.0 8
1.0 25
11.0 1
2.0 41
3.0 23
4.0 15
5.0 35
6.0 24
7.0 27
8.0 50
9.0 55
N 10
In [105]: news_converted_with_index.sort_index()
Out[105]:
data
Region
0.0 8
1.0 25
2.0 41
3.0 23
4.0 15
5.0 35
6.0 24
7.0 27
8.0 50
9.0 55
11.0 1
N 10
很可能有一种更好的方法来创建您的
系列
,这样它就不会混合索引类型。sort\u index()
仍然会提供与上面的Out[48]
相同的输出,11仍然在1和2之间。就像熊猫把索引值当作文本一样。不过,我确实有N
作为索引值之一。我把这条评论留给了bdiamente的回复,但这里也是:sort\u index()
仍然给我与上面的Out[48]
相同的输出,11仍然在1和2之间。就像熊猫把索引值当作文本一样。我确实有N
作为索引值之一。它们可能是文本,你是如何创建的?@marillion你的值是文本。您需要将数字转换为数字类型,并使用对象数据类型索引。然后,sort_index()
将执行您想要的操作,尽管很可能有更好的方法来执行此操作,而不必使用混合的数字/字符串索引。@Jeff df是使用pd.read_csv('filename.csv')构造的,然后我使用groupby
来计算唯一值的数量。可能数据中的“N”值导致了一个文本类型的索引。啊……没有看到N,是的,肯定是这样,它会自动显示文本。最好将thin放在一个数据框中,用一个数字替换该值,这样就可以很好地运行了。@Philip Cloud谢谢!这似乎解决了排序问题,现在我正在研究如何更好地构建这个系列,正如您所提到的。这一切都是从尝试计算df列中的唯一值开始的,df列中的“N”是数据值之一。这个问题是关于按索引对pandas系列进行排序的。如果希望了解如何按值对序列进行排序,请参阅。
In [11]: s.sort_values()
Out[11]:
2 1
3 2
1 3
dtype: int64
In [97]: s = read_clipboard(header=None)
In [98]: news = s.rename(columns=lambda x: ['Region', 'data'][x])
In [99]: news
Out[99]:
Region data
0 0 8
1 1 25
2 11 1
3 2 41
4 3 23
5 4 15
6 5 35
7 6 24
8 7 27
9 8 50
10 9 55
11 N 10
In [100]: news_converted = news.convert_objects(convert_numeric=True)
In [101]: news_converted
Out[101]:
Region data
0 0 8
1 1 25
2 11 1
3 2 41
4 3 23
5 4 15
6 5 35
7 6 24
8 7 27
9 8 50
10 9 55
11 NaN 10
In [102]: news_converted.loc[11, 'Region'] = 'N'
In [103]: news_converted_with_index = news_converted.set_index('Region')
In [104]: news_converted_with_index
Out[104]:
data
Region
0.0 8
1.0 25
11.0 1
2.0 41
3.0 23
4.0 15
5.0 35
6.0 24
7.0 27
8.0 50
9.0 55
N 10
In [105]: news_converted_with_index.sort_index()
Out[105]:
data
Region
0.0 8
1.0 25
2.0 41
3.0 23
4.0 15
5.0 35
6.0 24
7.0 27
8.0 50
9.0 55
11.0 1
N 10