在 Python Pandas 中查找两列的交集 -> 字符串列表

Posted

技术标签:

【中文标题】在 Python Pandas 中查找两列的交集 -> 字符串列表【英文标题】:Find intersection of two columns in Python Pandas -> list of strings 【发布时间】:2018-09-22 14:09:50 【问题描述】:

我想计算 A 列和 B 列有多少实例相交。 A 列和 B 列中的行是字符串列表。 例如,A 列可能包含 [汽车、乘客、卡车],而 B 列可能包含 [汽车、房屋、花、卡车]。由于在这种情况下,2 个字符串重叠,C 列应该显示 -> 2

我已经尝试过(这些都不起作用):

df['unique'] = np.unique(frame[['colA', 'colB']])

def unique(colA, colB):
    unique1 = list(set(colA) & set(colB))
    return unique1

df['unique'] = df.apply(unique, args=(df['colA'], frame['colB']))

TypeError: ('unique() 接受 2 个位置参数,但给出了 3 个','发生在索引文章')

【问题讨论】:

minimal reproducible example 请提供可重现的代码示例? 您希望我添加什么?我使用了上面的代码并提供了错误。 【参考方案1】:

我认为列表理解中需要lengthset.intersection

df['C'] = [len(set(a).intersection(b)) for a, b in zip(df.A, df.B)]

或者:

df['C'] = [len(set(a) & set(b)) for a, b in zip(df.A, df.B)]

示例

df = pd.DataFrame(data='A':[['car', 'passenger', 'truck'], ['car', 'truck']],
                        'B':[['car', 'house', 'flower', 'truck'], ['car', 'house']])
print (df)
                         A                            B
0  [car, passenger, truck]  [car, house, flower, truck]
1             [car, truck]                 [car, house]

df['C'] = [len(set(a).intersection(b)) for a, b in zip(df.A, df.B)]
print (df)
                         A                            B  C
0  [car, passenger, truck]  [car, house, flower, truck]  2
1             [car, truck]                 [car, house]  1

【讨论】:

嗨@jezrael,我正在探索您的解决方案并且在功能上它有效。但是在大数据帧上,对于我的用例来说还不够快。我是 Pandas 的新手,所以你认为有可能通过一些数据操作来加快速度吗?我正在考虑转换 Series of Series 中的列表( stack_query_time_categorical = only_categorical['A'].apply(pd.Series).stack().astype('category') )但是我正在努力计算它们之间的交集对于所有值。

以上是关于在 Python Pandas 中查找两列的交集 -> 字符串列表的主要内容,如果未能解决你的问题,请参考以下文章

Python Pandas 计算两列的 value_counts 并使用 groupby

查找两列的最大值并在第三列中填充值

如何在 Pandas 中获得两列的组合? [复制]

在 Pandas、Python 中查找具有相同第一列的所有行的最小值、最大值、平均值

根据其他两列的值在 Pandas 中创建一个新列[重复]

在 Pandas 数据框中查找每三列的平均值