【问题标题】:Sort a String of Numbers in a Pandas Column对 Pandas 列中的一串数字进行排序
【发布时间】:2020-11-21 07:08:01
【问题描述】:

我之前创建了一个用于创建作者索引的 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]

【问题讨论】:

    标签: python pandas string sorting


    【解决方案1】:

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

    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]
    

    【讨论】:

      【解决方案2】:

      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]
      

      【讨论】:

      • 如果以后可能希望将其作为字符串返回,只需稍加补充,您可以将最后一行(使用 groupby)替换为以下 .groupby(level=0).agg(lambda x: ','.join(map(str, x)))
      猜你喜欢
      • 2020-11-19
      • 1970-01-01
      • 2016-01-23
      • 2012-09-20
      • 2020-05-19
      • 2017-11-28
      • 2020-01-02
      • 1970-01-01
      相关资源
      最近更新 更多