Pandas Dataframe-对列中每行的值列表进行排序
以下是一个数据帧:Pandas Dataframe-对列中每行的值列表进行排序,pandas,list,dataframe,sorting,Pandas,List,Dataframe,Sorting,以下是一个数据帧: 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
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、name、type、City
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\u值、排序、删除重复项;不工作。可能是我犯了一些错误。它会删除一些名称,这意味着在使用drop_duplicates()时会丢失一些名称。有人能帮我吗?谢谢。请尝试以下方法:
df[“type”]=df[“type”].apply(lambda x:sorted(list(x)))
这假设列“type”的所有值都是列表如果要对列
type
中的列表进行排序并删除基于其他列检查的重复项,可以使用对列表进行排序,然后使用检查其他列上的重复项:
使用numpy.sort()比类似的Python处理更高效,因为numpy模块针对系统性能进行了优化,并且对于panda和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
列表是否保证具有相同的值,或者是否需要逻辑将列表合并在一起?示例数据似乎存在一些问题。前两个列表是不同的。第二个有2个
AYPIC
我们是否也需要检查列类型的副本?似乎需要,对吗?对于每个列“名称”,列“类型”中的值列表是相同的,但没有按顺序排序。谢谢。对不起,更正了样本数据。无需检查“类型”列中的值列表中是否存在重复项。只需对其排序并选择不同的值,如示例输出中所示。您好,谢谢…我尝试了您的代码,得到的结果是:df.type.head()0[,,,,,,]…出现了一些问题。缺少值。df[“type”]=df[“type”].map(lambda x:sorted(list(x)))的工作方式与df['type']=df['type'].map(np.sort).map(list)的工作方式相同。谢谢。获取值错误:轴(=-1)超出范围。@Murali哪一行获取了错误?第一行还是第二行?列type
中的列表是真正定义为列表还是像列表一样编写的字符串?获取ValueError:axis(--1)超出第一行的界限:df['type']=df['type'].map(np.sort)@Murali在两行前面添加行df['type']=df['type'].str.strip('[]').str.split(',')
,然后重试。谢谢是的,谢谢,海豆。