我对Pandas中sort_values()的行为感到困惑,该行为似乎无法正确地响应axis参数。
举个玩具例子:
toy.to_json()
'{"labels":{"0":7,"1":4,"2":7,"3":1,"4":5,"5":0,"6":3,"7":1,"8":4,"9":9},"companies":{"0":"Apple","1":"AIG","2":"Amazon","3":"American express","4":"Boeing","5":"Bank of America","6":"British American Tobacco","7":"Canon","8":"Caterpillar","9":"Colgate-Palmolive"}}'
toy.sort_values('labels') # this works alright
labels companies
5 0 Bank of America
3 1 American express
7 1 Canon
6 3 British American Tobacco
1 4 AIG
8 4 Caterpillar
4 5 Boeing
0 7 Apple
2 7 Amazon
9 9 Colgate-Palmolive
toy.sort_values(by = 'labels', axis = 1) # Returns an exception
KeyError: 'labels'
答案 0 :(得分:1)
这是因为在示例中,轴0为“向下”,而轴1为“向右”(即跨列)
如果查看sort_values的文档,就会看到第一个参数确实是by
,而axis
的默认值是0。
因此,重复您的第一个示例,您需要执行toy.sort_values(by='labels', axis=0)
答案 1 :(得分:0)
为上述评论和答案添加示例:
假设您具有以下数据框:
df = pd.DataFrame(data={"labels":{"0":7,"1":4,"2":7,"3":1,"4":5},"companies":{"0":9,"1":1,"2":6,"3":1,"4":8}})
>>df
labels companies
0 7 9
1 4 1
2 7 6
3 1 1
4 5 8
对于axis=0
,当您通过以下方式传递索引级别和/或列标签时,它将进行排序:
df.sort_values(by='labels')
为您提供了经过排序的label
列(默认情况下升序)。
labels companies
3 1 1
1 4 1
4 5 8
0 7 9
2 7 6
来到axis=1
,请参考以下代码:
df.sort_values('4',axis=1)
这将以对index 4
进行排序的方式对列进行排序。由于index 4
小于5
,因此8
不会更改任何内容,默认情况下排序为ascending
。但是,如果执行df.sort_values('1',axis=1)
下的值大于label
的{{1}},则会看到companies
和labels
的位置已交换。 / p>
companies
希望这可以澄清。
答案 2 :(得分:0)
当我们选择axis=1
或axis=0
时,只是为了理解轴和行即可。
df.shape[0] # gives number of row count
df.shape[1] # gives number of col count
让我们假设一个dataFrame如下:
>>> df = pd.DataFrame({
... 'col1' : ['A', 'A', 'B', np.nan, 'D', 'C'],
... 'col2' : [2, 1, 9, 8, 7, 4],
... 'col3': [0, 1, 9, 4, 2, 3],
... })
>>> df
col1 col2 col3
0 A 2 0
1 A 1 1
2 B 9 9
3 NaN 8 4
4 D 7 2
5 C 4 3
因此,应用df.shape并查看它如何绕过列和行:
>>> df.shape[0]
6 <-- Here, we have six row into the dataFrame
>>> df.shape[1]
3 <-- Here, we have three columns into the dataFrame
现在,如果您只是按列名对值进行排序,那么由于已经指定了列名,因此无需指定axis=1
,只需执行以下操作即可:
>>> df.sort_values(by=['col1'])
col1 col2 col3
0 A 2 0
1 A 1 1
2 B 9 9
5 C 4 3
4 D 7 2
3 NaN 8 4
或者,您可以使用by
将多个列名作为列表传递:
>>> df.sort_values(by=['col1', 'col2'])
col1 col2 col3
1 A 1 1
0 A 2 0
2 B 9 9
5 C 4 3
4 D 7 2
3 NaN 8 4