gpt4 book ai didi

带有嵌套列表的 Python pandas sort_values()

转载 作者:行者123 更新时间:2023-12-04 01:02:06 26 4
gpt4 key购买 nike

我想通过 pandas 对 pyhon 中的嵌套字典进行排序。

import pandas as pd 

# Data structure (nested list):
# {
# category_name: [[rank, id], ...],
# ...
# }

all_categories = {
"category_name1": [[2, 12345], [1, 32512], [3, 32382]],
"category_name2": [[3, 12345], [9, 25318], [1, 24623]]
}

df = pd.DataFrame(all_categories.items(), columns=['Category', 'Rank'])
df.sort_values(['Rank'], ascending=True, inplace=True) # this only sorts the list of lists

谁能告诉我怎样才能达到我的目标?我想不通。通过 panda 可以按第二列进行 sort_values(),但我不知道如何对嵌套的字典/列表进行排序。

我想按等级而不是 id 升序排序。

最佳答案

最快的选择是应用 sort()(注意排序发生在适当的位置,所以在这种情况下不要分配回 df.Rank):

df.Rank.apply(list.sort)

或者将 sorted()custom key 一起使用并分配回 df.Rank:

df.Rank = df.Rank.apply(lambda row: sorted(row, key=lambda x: x[0]))

两种情况下的输出:

>>> df
Category Rank
0 category_name1 [[1, 32512], [2, 12345], [3, 32382]]
1 category_name2 [[1, 24623], [3, 12345], [9, 25318]]

这是 perfplot sort() 对比 sorted() 对比 explode():

timing results

import perfplot

def explode(df):
df = df.explode('Rank')
df['rank_num'] = df.Rank.str[0]
df = df.sort_values(['Category', 'rank_num']).groupby('Category', as_index=False).agg(list)
return df

def apply_sort(df):
df.Rank.apply(list.sort)
return df

def apply_sorted(df):
df.Rank = df.Rank.apply(lambda row: sorted(row, key=lambda x: x[0]))
return df

perfplot.show(
setup=lambda n: pd.concat([df] * n),
n_range=[2 ** k for k in range(25)],
kernels=[explode, apply_sort, apply_sorted],
equality_check=None,
)

要按列表长度过滤行,请使用 str.len() 屏蔽行和 loc[]:

mask = df.Rank.str.len().ge(10)
df.loc[mask, 'Rank'].apply(list.sort)

关于带有嵌套列表的 Python pandas sort_values(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67959535/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com