对列中的数字字符串进行排序

2024-05-13 04:43:24 发布

您现在位置:Python中文网/ 问答频道 /正文


我之前创建了一个python脚本,用于创建作者索引。
为了省去你的细节,(因为从pdf中提取文本非常困难),我创建了 一个最小的可重复的例子。我目前的状态是,我为每个作者和作者获得一行新词 作者所在页面的逗号分隔列表。 然而,我想以升序的方式对页面列表进行排序

import pandas as pd
import csv
words = ["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 Pages
0            Author2    20
1             Autor1  15,1
2  Bertha Musterfrau    17
3     Max Mustermann  13,5

我尝试将Pages列矢量化为字符串,用逗号分隔,并应用一个lambda函数,该函数应该对结果列表进行排序

df["Pages"] = df["Pages"].str.split(",").apply(lambda x: sorted(x))
df

然而,这只适用于Autor1,而不适用于Max Mustermann。 我似乎不明白为什么会这样

               Autor    Pages
0            Author2     [20]
1             Autor1  [1, 15]
2  Bertha Musterfrau     [17]
3     Max Mustermann  [13, 5]

Tags: df列表排序作者页面pagesmaxstr
2条回答

如果您想使用现有的方法

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]

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]

相关问题 更多 >