python3:DF'的排序Dict;按最后一行的列值排序
df的指令: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
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,我接受这个答案以获得更详细的解释,并对另一个答案进行投票