如何使用python itertools.compositions
我试图从所有供应商组合中找出可能的产品列表。 找出组合中的任何一个都可以生产出产品如何使用python itertools.compositions,python,python-3.x,Python,Python 3.x,我试图从所有供应商组合中找出可能的产品列表。 找出组合中的任何一个都可以生产出产品 import itertools import pandas as pd import numpy as np Column = {'ID':['1','2','3','4','5'],'Supplier 1':['B','B','A','B','B'],'Supplier 2':['A','NaN','B','NaN','A']} df=pd.DataFrame(Column) df # Define al
import itertools
import pandas as pd
import numpy as np
Column = {'ID':['1','2','3','4','5'],'Supplier 1':['B','B','A','B','B'],'Supplier 2':['A','NaN','B','NaN','A']}
df=pd.DataFrame(Column)
df
# Define all Supplier Columns
cols = [c for c in df.columns if "Supplier" in c]
# get unique suppliers
suppl = np.unique(np.concatenate([df[c].dropna() for c in cols]))
result = []
for sn in range(len(suppl)):
# generate combinations of suppliers
for combi in itertools.combinations(suppl, sn+1):
result.append({combi:......
从
Desire(任一供应商均可生产):
新代码:
from itertools import combinations, chain
import pandas as pd
import numpy as np
df = {'ID':['1','2','3','4','5'],'Supplier 1':['B','B','A','B','B'],'Supplier 2':['A',np.nan,'B',np.nan,'A']}
df=pd.DataFrame(Column)
from itertools import combinations, chain
g1 = df.groupby(['Supplier 1'])['ID'].apply(list)
g2 = df.groupby(['Supplier 2'])['ID'].apply(list)
res = (g1 + g2).to_dict()
res = [[','.join(comb), ','.join(sorted(set(chain.from_iterable([res[k] for k in comb]))))]
for x in range(1, len(res) + 1) for comb in combinations(res.keys(), x)]
df2 = pd.DataFrame(res, columns=['Supplier', 'ID'])
print(df2)
这不是一个有效的解决方案,但会奏效
from itertools import combinations, chain
g1 = df.groupby(['Supplier 1'])['ID'].apply(list)
g2 = df.groupby(['Supplier 2'])['ID'].apply(list)
res = (g1 + g2).to_dict()
res = [[','.join(comb), ','.join(sorted(set(chain.from_iterable([res[k] for k in comb]))))]
for x in range(1, len(res) + 1) for comb in combinations(res.keys(), x)]
df2 = pd.DataFrame(res, columns=['Supplier', 'ID'])
print(df2)
输出:
Supplier ID
0 A 1,3,5
1 B 1,2,3,4,5
2 A,B 1,2,3,4,5
Supplier 2
在您的字典中有C
,但您的示例没有显示C
@deadshot,我错了。桌子上只有A和B。感谢感谢@deadshot,但它弹出了一个错误。这种事发生在你身上吗-->12用于范围(1,len(res)+1)内的x,用于组合中的梳(res.keys(),x)]类型错误:“float”对象不可编辑
不,我没有收到任何错误。将“NaN”替换为仍显示错误的np.nanIt。我已经把完整的代码贴在上面了。你能帮我看一下吗。非常感谢。删除np周围的引号。但同样的错误。我只是完全复制了你的代码,没有修改。不知道发生了什么
from itertools import combinations, chain
g1 = df.groupby(['Supplier 1'])['ID'].apply(list)
g2 = df.groupby(['Supplier 2'])['ID'].apply(list)
res = (g1 + g2).to_dict()
res = [[','.join(comb), ','.join(sorted(set(chain.from_iterable([res[k] for k in comb]))))]
for x in range(1, len(res) + 1) for comb in combinations(res.keys(), x)]
df2 = pd.DataFrame(res, columns=['Supplier', 'ID'])
print(df2)
Supplier ID
0 A 1,3,5
1 B 1,2,3,4,5
2 A,B 1,2,3,4,5