我有两列,例如:
Name : Alex, Mohan, Rex
City : Delhi, Chennai, Mumbai, Kolkata
约束: (如果姓名= Mohan,则城市=钦奈)或(如果姓名= REX而不是City =孟买)
输出:
[(Alex,Delhi),(Alex,Chennai),(Alex,Mumbai),(Alex,Kolkata),(Mohan,Chennai),(Rex, Mumbai)]
正常组合,我能够生成12,但是在应用约束之后我无法生成。请提出您的解决方案。
答案 0 :(得分:1)
您可以进行交叉联接,然后手动过滤出行。
假设您的数据框看起来像这样
name city
0 Alex Delhi
1 Mohan Chennai
2 Rex Mumbai
3 NaN Kolkata
df2 = pd.merge(
df[['city']].assign(key='key'),
df[['name']].dropna().assign(key='key'),
on='key',how='outer'
).drop('key',axis=1)
mohan = df2[(df2['name'] == 'Mohan') & (df2['city'] == 'Chennai')].index
rex = df2[(df2['name'] == 'Rex') & (df2['city'] == 'Mumbai')].index
df3 = pd.concat([df2.iloc[mohan|rex],df2[~df2['name'].isin(['Mohan','Rex'])]])
print(list(df3.itertuples(index=None,name=None)))
[('Chennai', 'Mohan'),
('Mumbai', 'Rex'),
('Delhi', 'Alex'),
('Chennai', 'Alex'),
('Mumbai', 'Alex'),
('Kolkata', 'Alex')]
答案 1 :(得分:0)
names = ["Alex", "Mohan", "Rex"]
cities = ["Delhi", "Chennai", "Mumbai", "Kolkata"]
constraint = {"Mohan":"Chennai","Rex":"Mumbai"}
result = []
for name in names:
if name in constraint:
result.append((name,constraint[name]))
continue
else:
for city in cities:
result.append((name,city))
print(result)
输出:
[('Alex', 'Delhi'), ('Alex', 'Chennai'), ('Alex', 'Mumbai'), ('Alex', 'Kolkata'), ('Mohan', 'Chennai'), ('Rex', 'Mumbai')]
其他情况:
cities = ["Delhi", "Chennai", "Mumbai", "Kolkata"]
cities_map = [1, 2, 3, 4]
dict_city = dict(zip(cities_map,cities))
result2 = []
for city_ix,city in dict_city.items():
if city_ix >=2:
result2.append(("Alex",city))
continue
else:
for name in names:
if name is not "Alex":
result2.append((name,city))