在 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】:我认为列表理解中需要length
和set.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