首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫会用所有的子串组合爆炸行。

熊猫会用所有的子串组合爆炸行。
EN

Stack Overflow用户
提问于 2022-05-01 11:37:38
回答 3查看 135关注 0票数 0

我试图找到在一个列中找到的一个子字符串的所有组合,然后用每个单词的所有可能组合来爆炸dataframe。

示例Dataframe

代码语言:javascript
复制
                     URL                Keyword
0  http://www.amazon.com  Amazon Lightning Sale
1   https://www.ebay.com        Shop eBay Today

期望输出

代码语言:javascript
复制
                      URL                Keyword
0   http://www.amazon.com  Amazon Lightning Sale
1   http://www.amazon.com  Amazon Sale Lightning
2   http://www.amazon.com  Lightning Amazon Sale
3   http://www.amazon.com  Sale Amazon Lightning
4   http://www.amazon.com  Sale Lightning Amazon
5   http://www.amazon.com  Lightning Sale Amazon
6    https://www.ebay.com        Shop eBay Today
7    https://www.ebay.com        Shop Today eBay
8    https://www.ebay.com        eBay Shop Today
9    https://www.ebay.com        eBay Today Shop
10   https://www.ebay.com        Today eBay Shop
11   https://www.ebay.com        Today Shop eBay

最小可再生示例

代码语言:javascript
复制
import pandas as pd

# initialize data of lists.
data = {'URL': ['http://www.amazon.com', 'https://www.ebay.com'],
        'Keyword': ["Amazon Lightning Sale", "Shop eBay Today"]}

# Create DataFrame
df = pd.DataFrame(data)

# Print the output.
print(df)

我在这里尝试过解决方案:Pandas DataFrame Combinations and expand,但这并不完全是我所需要的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-05-01 14:13:15

这里有一种不使用迭代工具的替代方法:

代码语言:javascript
复制
(df.assign(Keyword = df['Keyword'].str.split().map(lambda x: [[i,j,k] for i in x for j in x for k in x if len({i,j,k})==len(x)]))
 .explode('Keyword')
 .assign(Keyword = lambda x: x['Keyword'].str.join(' ')))

输出:

代码语言:javascript
复制
                     URL                Keyword
0  http://www.amazon.com  Amazon Lightning Sale
0  http://www.amazon.com  Amazon Sale Lightning
0  http://www.amazon.com  Lightning Amazon Sale
0  http://www.amazon.com  Lightning Sale Amazon
0  http://www.amazon.com  Sale Amazon Lightning
0  http://www.amazon.com  Sale Lightning Amazon
1   https://www.ebay.com        Shop eBay Today
1   https://www.ebay.com        Shop Today eBay
1   https://www.ebay.com        eBay Shop Today
1   https://www.ebay.com        eBay Today Shop
1   https://www.ebay.com        Today Shop eBay
1   https://www.ebay.com        Today eBay Shop
票数 1
EN

Stack Overflow用户

发布于 2022-05-01 11:41:31

  1. 为每一行创建一个ID

#创建id: df' ID‘= range(df.shape) URL关键字ID 0 http://www.amazon.com Amazon 0 1 https://www.ebay.com Shop eBay eBay 1

  1. 将每一行的组合创建为新的DataFrame,或dict或.

导入新导入迭代工具def create_combinations(id,kw):#拆分关键字:re.split= re.split('\W+',kw)返回pd.DataFrame( {'ID':id,‘组合键’,'.join(x) } for x in itertools.permutations(Word))# create组合数据= [] for id,kw in zip(df.ID,df.Keyword):data.append( id,kw )

  1. pd.merge(df,pd.concat(数据)),上= ' ID ') URL关键字ID组合0亚马逊闪电销售0亚马逊闪电销售0亚马逊闪电销售1亚马逊闪电销售0亚马逊闪电销售2亚马逊闪电销售0亚马逊闪电销售3亚马逊闪电销售0亚马逊闪电销售亚马逊4 http://www.amazon.com亚马逊闪电销售0亚马逊闪电销售5 http://www.amazon.com亚马逊闪电销售0销售闪电亚马逊6 https://www.ebay.com商店eBay今天1商店eBay今天7商店今天7 https://www.ebay.com商店今天1商店今天eBay 8 https://www.ebay.com商店今天1 eBay商店今天9 https://www.ebay.com Shop eBay今天1 eBay今天商店10 https://www.ebay.com商店eBay今天1今天商店eBay 11商店eBay今日1 Shop eBay 11 https://www.ebay.com Shop eBay今日11 19

Joost D bken的回答更优雅一些

票数 1
EN

Stack Overflow用户

发布于 2022-05-01 11:53:17

代码语言:javascript
复制
from itertools import permutations

df['Keyword'] = df['Keyword'].apply(lambda x: list(permutations(x.split())))
df.explode('Keyword', ignore_index=True)

首先,应用于关键字列的itertools.permutations方法将创建作为列表的所有可能的关键字组合。

接下来,您可以使用pandas.DataFrame.explode函数从创建的列表中创建许多项。

如果你真的想要一个完整的字符串而不是一个关键字的元组,你可以用一个字符串连接:[" ".join(t) for t in permutations(x.split())]来替换这个[" ".join(t) for t in permutations(x.split())]部件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72076327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档