Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python3:DF'的排序Dict;按最后一行的列值排序_Python_Dictionary - Fatal编程技术网

python3:DF'的排序Dict;按最后一行的列值排序

python3:DF'的排序Dict;按最后一行的列值排序,python,dictionary,Python,Dictionary,df的指令: years = [2017, 2018, 2019] dfcols = ['Count', 'Amount'] dataframedict = {'CatA': pd.DataFrame(data=[[1, 5], [2, 6], [3, 7]], columns=dfcols, index=years), 'CatB': pd.DataFrame(data=[[4, 8], [5, 9], [6, 19]], columns=dfcols, in

df的指令:

years = [2017, 2018, 2019]
dfcols = ['Count', 'Amount']
dataframedict = {'CatA': pd.DataFrame(data=[[1, 5], [2, 6], [3, 7]], columns=dfcols, index=years), 
                'CatB': pd.DataFrame(data=[[4, 8], [5, 9], [6, 19]], columns=dfcols, index=years), 
                'CatC': pd.DataFrame(data=[[7,11], [8,12], [9,13]], columns=dfcols, index=years)}
需要2019年按“金额”降序排列的dict密钥列表,因此['CatB'、'CatC'、'CatA']

试过,以下是:

for k in sorted(dataframedict, key=lambda df: df.Amount[-1], reverse=True):
    print(k)
获取错误:
AttributeError:“str”对象没有属性“Amount”


谢谢

您可以将dict转换为元组排序列表:

for k, v in sorted(dataframedict.items(), key=lambda x: x[1].Amount.iloc[-1], reverse=True):
    print(k)
输出:

CatB
CatC
CatA
请注意,我正在将
.items()
传递到已排序的
中。每一个都是长度为2的元组(
x[0]
是键,
x[1]
是值/df)

现在,关于您的错误:当您以排序方式传递dict时,将考虑dict的键:

>>> a = {1: "ad", 0: "ads"}
>>> sorted(a, key=lambda x: x)
[0, 1]

因此,您在
lambda

中传递字符串如果您只想要一个列表,您可以使用列表理解和字典的
.items
方法来检索键和数据帧

[
    k for k, df 
    in sorted(dataframedict.items(), key=lambda x: x[1].Amount.iloc[-1], reverse=True)
]
# returns:
['CatB', 'CatC', 'CatA']

@詹姆斯:你没有迭代元组列表,所以我的
k
是一个元组。现在,我已经将其解包为键和值-编辑:我明白你的意思-只是复制了原始代码-未经测试,但似乎
iloc
解决了问题,对吗?这仍然给出了一个键错误,不是来自字典,而是来自试图从数据帧的
Amount
列中获取
[-1]
索引。该索引不存在,因此会出现
KeyError
。for循环对你有用吗?@James,修复了
iloc
-只是花了一段时间在这里安装了一个终端:)。我还认为最好提供一个解释,说明为什么原始错误发生(以及为什么df键错误发生在数量上),以使答案完整。对于这个用户和@James,我接受这个答案以获得更详细的解释,并对另一个答案进行投票