【问题标题】:Pandas Dataframe - sort a list of values in each row of a columnPandas Dataframe - 对列的每一行中的值列表进行排序
【发布时间】:2021-08-24 17:03:02
【问题描述】:

这是一个熊猫数据框:

dt          name  type                                         City                            
05-10-2021  MK    [PQRRC, MNXYZ, AYPIC, KLUYT, GFTBE, BYPAC]   NYC
05-10-2021  MK    [GFTBE, AYPIC, MNXYZ, BYPAC, KLUYT, PQRRC]   NYC
05-12-2021  MK    [KLUYT, PQRRC, BYPAC, AYPIC, GFTBE, MNXYZ]   NYC
05-12-2021  MK    [BYPAC, KLUYT, GFTBE, AYPIC, MNXYZ, PQRRC]   NYC
05-13-2021  PS    [XYDFE, QRTSL, CPQLE, VXWUT, ORSHC, LTRDX]   BAL
05-13-2021  PS    [VXWUT, ORSHC, QRTSL, XYDFE, LTRDX, CPQLE]   BAL

.... 请注意,每个列名称的列类型中的值列表是相同的,但不按字母顺序排序。

我希望输出如下:对列类型进行排序并找到不同的 dt、名称、类型、城市。

dt          name  type                                         City                            
05-10-2021  MK    [AYPIC, BYPAC, GFTBE, KLUYT, MNXYZ, PQRRC]   NYC
05-12-2021  MK    [AYPIC, BYPAC, GFTBE, KLUYT, MNXYZ, PQRRC]   NYC
05-13-2021  PS    [CPQLE, LTRDX, ORSHC, QRTSL, VXWUT, XYDFE]   BAL

我尝试使用 sort_values、sorted、drop_duplicates;不工作。可能是我犯了一些错误。它完全删除了一些名称,这意味着在使用 drop_duplicates() 时丢失了一些名称。有人能帮我吗?谢谢。

【问题讨论】:

  • 列表是否保证具有相同的值,或者是否需要将列表合并在一起的逻辑?
  • 样本数据似乎有问题。前 2 个列表是不同的。第二有 2 AYPIC
  • 我们是否还需要检查列type 的重复项?似乎需要,对吧?
  • 对于每一列'name','type'列中的值列表是相同的,但没有按顺序排序。谢谢。
  • 抱歉,已更正示例数据。无需检查“类型”列中的值列表中的重复项。只需对其进行排序并选择不同的值,如示例输出所示。

标签: python pandas list dataframe sorting


【解决方案1】:

如果要对type列中的列表进行排序,并删除基于其他列检查的重复项,可以使用numpy.sort()对列表进行排序,然后使用.drop_duplicates()对其他列进行检查重复项:

使用 numpy.sort() 比类似的 Python 处理更高效,因为 numpy 模块针对系统性能进行了优化,并且对于 Pandas 和 numpy 列表/数组运行更快。

import numpy as np

# in case your column "type" is of string type, run one of the following line (depending on your string list layout):
# use this for string list layout e.g. "['GFTBE', 'AYPIC', 'MNXYZ', 'BYPAC', 'KLUYT', 'PQRRC']"
df['type'] = df['type'].str.strip("[]").str.replace("'", "").str.split(', ')   
#df['type'] = df['type'].map(eval)    # for general use to convert string like a list to a real list
#df['type'] = df['type'].str.strip('[]').str.split(',')  # for use when no extra spaces and extra single quotes  


df['type'] = df['type'].map(np.sort).map(list)   # convert the sorted numpy array to Python list to avoid incorrect formatting (e.g. missing comma) in writing to CSV 
df = df.drop_duplicates(subset=['dt', 'name', 'City'])

结果:

print(df)

           dt name                                        type City
0  05-10-2021   MK  [AYPIC, BYPAC, GFTBE, KLUYT, MNXYZ, PQRRC]  NYC
2  05-12-2021   MK  [AYPIC, BYPAC, GFTBE, KLUYT, MNXYZ, PQRRC]  NYC
4  05-13-2021   PS  [CPQLE, LTRDX, ORSHC, QRTSL, VXWUT, XYDFE]  BAL

【讨论】:

  • Getting ValueError: axis(=-1) out of bounds.
  • @Murali 哪一行出现错误?第一行还是第二行?您在列type 中列出的列表真的定义为列表还是只是像列表一样写的字符串?
  • Getting ValueError:axis(=-1) out of bounds for the first line: df['type'] = df['type'].map(np.sort)
  • @Murali 在这两行前面添加df['type'] = df['type'].str.strip('[]').str.split(',') 行,然后重试。谢谢!
  • 在最终输出中,使用您的代码后,我在“类型”列的值列表中看到一个额外的双引号 + 一个空格。例如,["'AYPIC'"、"'BYPAC'"、"'GFTBE'"、"'KLUYT'"、"'MNXYZ'"、"'PQRRC'"]。怎么去掉?
【解决方案2】:

试试下面的:

df["type"] = df["type"].apply(lambda x: sorted(list(x)))

这假定列 'type' 的所有值都是列表

【讨论】:

  • 嗨,Amine,谢谢...我尝试了您的代码,我得到的结果是:df.type.head() 0 [, , , , ,]...出了点问题。缺少值。
  • df["type"] = df["type"].map(lambda x: sorted(list(x))) 的工作方式与 df['type'] = df['类型'].map(np.sort).map(list)。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-04-20
  • 2014-11-29
  • 2017-09-14
  • 1970-01-01
  • 2016-09-14
  • 1970-01-01
  • 2021-03-21
  • 2022-12-11
相关资源
最近更新 更多