![729dbf359d95cd05d803be597008381c.png](https://i-blog.csdnimg.cn/blog_migrate/bddff8dc9f91224dad461bab165d639c.jpeg)
数据情况:
>>> df=pd.read_excel('/Users/dxn/Desktop/结果.xlsx',header=[0,1])
>>> df
Unnamed: 0_level_0 物料名称 ... 价税合计
日期 Unnamed: 1_level_1 ... 2019 2020
0 536 胶质 ... 4081450.0 3426400.0
1 70 甲基-2(1H) ... NaN 1022700.0
2 456 氢苯二甲酸 ... 645000.0 825100.0
3 985 梨酯 ... 1200000.0 720000.0
4 494 微晶纤维素 ... 94150.0 448000.0
... ... ... ... ... ...
1213 1207 高碘酸 ... NaN NaN
想对价税合计一列重新排序,
>>> df.sort_values(by=df.loc[:,pd.IndexSlice[:,'2020']],inplace=True)
但报错了,却不明白原因。
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
df.sort_values(by=df.loc[:,pd.IndexSlice[:,'2020年']],inplace=True)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pandas/core/frame.py", line 5293, in sort_values
k = self._get_label_or_level_values(by, axis=axis)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pandas/core/generic.py", line 1560, in _get_label_or_level_values
raise KeyError(key)
KeyError: 价税合计
2020年
0 3426400.0
1 1022700.0
2 825100.0
3 720000.0
4 448000.0
... ...
1213 NaN
1214 NaN
1215 NaN
1216 NaN
1217 NaN
[1218 rows x 1 columns]
经过不断试错,终于查找到了原因。
上面出现的错误,原因在于对sort_values()参数,理解并不透彻。
DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False, key=None)[source]¶
Sort by the values along either axis.
Parameters
by: str or list of str
第一个参数by是str or list of str,默认是列名或列名列表;如果设置axis=1时,by应是行索引名或行索引名列表。
by=df.loc[:,pd.IndexSlice[:,'2020']],这里by参数已经不是列名了,而是一个指定列名下的DataFrame了,成了一个非合法的参数了。对于多层级索引的DataFrame,指定列的列名获取,一个元组就可以了:('价税合计','2020');那么以此元组作为by的参数,问题就迎刃而解了。
>>> df.sort_values(by=('价税合计','2020'),inplace=True)
>>> df
Unnamed: 0_level_0 物料名称 价税合计 ...
日期 Unnamed: 1_level_1 2015 ... 2018 2019 2020
499 504 抗坏血酸 NaN ... 10.0 NaN 12.0
498 621 氨基磺酸 NaN ... NaN NaN 15.0
497 955 结晶碳酸钠 10.0 ... NaN NaN 16.0
496 557 柠檬酸三钠(AR) NaN ... NaN NaN 17.0
495 143 三氯化铁 NaN ... NaN NaN 18.0
... ... ... ... ... ... ... ...
1213 1207 高碘酸 NaN ... NaN NaN NaN
1214 1208 高碘酸钠 332.0 ... 170.0 NaN NaN
这个时候来看,出现的报错问题是非常简单的,简单到自己都觉得自己实在是十足的愚笨,竟然让这么个小问题折磨了一天的时间。还好,在不长的时间里找到了原因,心里豁然开朗,顿感心旷神怡。
在自学的道路上,因为学的不系统、不扎实,一个不小心、一个小疏忽,就会给自己埋下大坑。一路过来,时不时会遇到类似的问题,需要不断回头再学习再加深,以填补之前学习不到位的空白,以这种渐进的方式,在反复中不断完成对目标的完整认识与掌握。你会问,这样你累不?累!
但我乐意!!