为了账号安全,请及时绑定邮箱和手机立即绑定

对 Pandas 列中的一串数字进行排序

对 Pandas 列中的一串数字进行排序

慕的地10843 2023-04-18 15:09:10
我之前创建了一个创建作者索引的 python 脚本。为了省去细节,(因为从 pdf 中提取文本非常困难)我创建了一个最小的可重现示例。我目前的状态是我为每个作者换了一行,并以逗号分隔的作者出现的页面列表。但是我想以升序方式对页面列表进行排序。import pandas as pdimport csvwords = ["Autor1","Max Mustermann","Max Mustermann","Autor1","Bertha Musterfrau","Author2"]pages = [15,13,5,1,17,20]str_pages = list(map(str, pages))df = pd.DataFrame({"Autor":words,"Pages":str_pages})df = df.drop_duplicates().sort_values(by="Autor").reset_index(drop=True)df = df.groupby("Autor")['Pages'].apply(lambda x: ','.join(x)).reset_index()df这会产生所需的输出(页面排序除外)。               Autor Pages0            Author2    201             Autor1  15,12  Bertha Musterfrau    173     Max Mustermann  13,5我尝试将Pages列矢量化为字符串,用逗号分隔并应用一个 lambda 函数,该函数应该对结果列表进行排序。df["Pages"] = df["Pages"].str.split(",").apply(lambda x: sorted(x))df然而,这只适用于Autor1但不适用于Max Mustermann. 我似乎无法弄清楚为什么会这样               Autor    Pages0            Author2     [20]1             Autor1  [1, 15]2  Bertha Musterfrau     [17]3     Max Mustermann  [13, 5]
查看完整描述

2 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

str.split返回字符串列表。所以lambda x: sorted(x)仍然按字符串排序,而不是整数。


你可以试试:


df['Pages'] = (df.Pages.str.split(',')

   .explode().astype(int)

   .sort_values()

   .groupby(level=0).agg(list)

)

输出:


               Autor    Pages

0            Author2     [20]

1             Autor1  [1, 15]

2  Bertha Musterfrau     [17]

3     Max Mustermann  [5, 13]


查看完整回答
反对 回复 2023-04-18
?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

如果您想使用现有的方法,


df.Pages = (

    df.Pages.str.split(",")

        .apply(lambda x: sorted(x, key=lambda x: int(x)))

)

               Autor    Pages

0            Author2     [20]

1             Autor1  [1, 15]

2  Bertha Musterfrau     [17]

3     Max Mustermann  [5, 13]


查看完整回答
反对 回复 2023-04-18
  • 2 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信