簡體   English   中英

對 Pandas 列中的一串數字進行排序

[英]Sort a String of Numbers in a Pandas Column


我之前創建了一個創建作者索引的 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

這將產生所需的 output(頁面排序除外)。

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

我嘗試將Pages列矢量化為字符串,用逗號分隔並應用 lambda function 應該對結果列表進行排序。

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]

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

你可以試試:

df['Pages'] = (df.Pages.str.split(',')
   .explode().astype(int)
   .sort_values()
   .groupby(level=0).agg(list)
)

Output:

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

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

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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM