python - 根据公共(public)字符串将列表排序为列表,同时保留整个列表

标签 python pandas list dataframe pandas-groupby

我有一个类似于以下内容的数据集:

old_data = [[0,0,0,X],[1,0,0,A],[2,0,0,HJ],[3,0,0,X],[4,0,0,A],[5,0,0,K],[6,0,0,K]

我希望能够将列表分类到它们自己的单独列表中,这些列表需要以下内容:

X_list = [[0,0,0,X],[3,0,0,X]]
A_list = [[1,0,0,A],[4,0,0,A]]
HJ_list = [[2,0,0,HJ]]
K_list = [[5,0,0,K],[6,0,0,K]]

我尝试使用 pandas 中的一些功能和堆栈上的其他一些解决方案,但是,它们都将特定值分组到一个列表中,最终删除了列表中的所有其他数据。此外,将有 X 数量的列表 [3],因此需要生成 X 数量的列表。我之前尝试过的是:

values = sorted(set(map(lambda x: x[3], old_data)))
newlist = [[y[3] for y in old_data if y[3] == x] for x in values]

输出如下:

newlist = [[X,X],[A,A],[HG],[K,K]]

如果有某种方式可以重新排列上面的代码,也许可以保留所有数据并使用 for 循环创建 X 数量的列表?我不太理解上面的代码,所以我不知道该怎么做。否则,可能以某种方式使用 Pandas ?

最佳答案

您可以简单地使用 itertools.groupby :

from itertools import groupby
old_data = [[0,0,0,'X'],
            [1,0,0,'A'],
            [2,0,0,'HJ'],
            [3,0,0,'X'],
            [4,0,0,'A'],
            [5,0,0,'K'],
            [6,0,0,'K']]

{k: list(v) for k,v in groupby(sorted(old_data, key=lambda x: x[-1]), lambda x: x[-1])}

输出:

{'A': [[1, 0, 0, 'A'], [4, 0, 0, 'A']],
 'HJ': [[2, 0, 0, 'HJ']],
 'K': [[5, 0, 0, 'K'], [6, 0, 0, 'K']],
 'X': [[0, 0, 0, 'X'], [3, 0, 0, 'X']]}

如果您想要自定义组名:

{k+'_list': list(v)
 for k,v in groupby(sorted(old_data, key=lambda x: x[-1]),
lambda x: x[-1])}
{'A_list': [[1, 0, 0, 'A'], [4, 0, 0, 'A']],
 'HJ_list': [[2, 0, 0, 'HJ']],
 'K_list': [[5, 0, 0, 'K'], [6, 0, 0, 'K']],
 'X_list': [[0, 0, 0, 'X'], [3, 0, 0, 'X']]}

关于python - 根据公共(public)字符串将列表排序为列表,同时保留整个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68592503/

相关文章:

python - 什么是python中的绝对导入?

python - Pandas 使用其他列中的值创建新列,并根据列值进行选择

excel - 如何从开始编号和结束编号创建列表

python - django 1.8.3 python manage.py 迁移 Linux

python - 使用 mayavi 和 python 远程绘图

python - 在 python 与 matlab 中切片矩阵

python - 如何设置列索引

python - 如何截断 Pandas 时间序列数据框中的列以删除前导零和尾随零?

python - 从元组列表中返回具有最小 y 值的元组

r - 处理 list 对象