What I need:

我有一个数据帧,其中列的元素是列表.列表中没有重复的元素.例如,如下所示的数据帧:

import pandas as pd

>>d = {'col1': [[1, 2, 4, 8], [15, 16, 17], [18, 3], [2, 19], [10, 4]]}
>>df = pd.DataFrame(data=d)

           col1
0  [1, 2, 4, 8]
1  [15, 16, 17]
2       [18, 3]
3       [2, 19]
4       [10, 4]

我想要获得一个数据帧,其中,如果包含在第i行的列表中的至少一个数字也包含在第j行的列表中,则这两个列表被合并(没有重复).但是这些值也可以被两个以上的列表共享,在这种情况下,我希望所有共享至少一个值的列表都被合并.

                   col1
0  [1, 2, 4, 8, 19, 10]
1          [15, 16, 17]
2               [18, 3]

输出数据帧的行的顺序或列表中的值都很重要.


What I tried:

我找到了这个answer,它显示了如何判断列表中是否至少有一项包含在另一个列表中,例如

>>not set([1, 2, 4, 8]).isdisjoint([2, 19])
True

返回True,因为2包含在两个列表中.

我还发现了这个有用的answer,它显示了如何将数据帧的每一行相互比较.答案使用lambda将定制函数应用于数据帧的每一行.

df.apply(lambda row: func(row['col1']), axis=1)

然而,我不确定如何将这两件事放在一起,如何创建func方法.此外,我甚至不知道这种方法是否可行,因为生成的行数可能会少于原始数据帧的行数.

谢谢!

推荐答案

这并不是直截了当的.合并名单有很多trap .

一种可靠的方法是使用专门库,例如使用networkx来使用图形方法.您可以生成连续的边并查找连接的零部件.

这是你的图表:

networkx graph list merging

因此,您可以:

  • 使用add_edges_from生成连续边
  • 找到那connected_components
  • 制作一本词典,并在每个列表的第一项添加map个条目
  • groupby并合并列表(您可以直接使用连接的组件,但我给出了一个简单的解决方案,以防您有更多的列要处理)
import networkx as nx

G = nx.Graph()
for l in df['col1']:
    G.add_edges_from(zip(l, l[1:]))

groups = {k:v for v,l in enumerate(nx.connected_components(G)) for k in l}
# {1: 0, 2: 0, 4: 0, 8: 0, 10: 0, 19: 0, 16: 1, 17: 1, 15: 1, 18: 2, 3: 2}

out = (df.groupby(df['col1'].str[0].map(groups), as_index=False)
         .agg(lambda x: sorted(set().union(*x)))
       )

输出:

                   col1
0  [1, 2, 4, 8, 10, 19]
1          [15, 16, 17]
2               [3, 18]

Python相关问答推荐

Python daskValue错误:无法识别的区块管理器dask -必须是以下之一:[]

. str.替换pandas.series的方法未按预期工作

将两只Pandas rame乘以指数

如何获取TFIDF Transformer中的值?

如何在虚拟Python环境中运行Python程序?

数据抓取失败:寻求帮助

如何在Raspberry Pi上检测USB并使用Python访问它?

判断solve_ivp中的事件

幂集,其中每个元素可以是正或负""""

python—telegraph—bot send_voice发送空文件

如何创建引用列表并分配值的Systemrame列

如何获取Python synsets列表的第一个内容?

如果包含特定值,则筛选Groupby

如何在Gekko中使用分层条件约束

递归函数修饰器

如何将返回引用的函数与pybind11绑定?

如何提高Pandas DataFrame中随机列 Select 和分配的效率?

在任何要保留的字段中添加引号的文件,就像在Pandas 中一样

如何在PYTHON中向单元测试S Side_Effect发送额外参数?

如何在Polars中处理用户自定义函数的多行结果?