我试图从所有供应商组合中找出可能的产品清单。在组合中找出任何一个都可以生产出产品。
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:......从…
ID Supplier 1 Supplier 2
1 B A
2 B NaN
3 A B
4 B NaN
5 B A欲望(任何一个供应商都可以生产):
Supplier ID
A 1,3,5
B 1,2,3,4,5
A,B 1,2,3,4,5新代码:
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)发布于 2020-09-02 08:23:57
不是一个有效的解决方案,但这会奏效的。
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,5https://stackoverflow.com/questions/63700395
复制相似问题