基于列标题的具有多个约束的列值组合

2024-04-23 17:12:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个专栏,例如:

Name : Alex, Mohan, Rex

City : Delhi, Chennai, Mumbai, Kolkata

约束条件: (如果名称=莫汉,则城市=钦奈)或(如果名称=雷克斯,则城市=孟买)

输出:

[(Alex,Delhi),(Alex,Chennai),(Alex,Mumbai),(Alex,Kolkata),(Mohan,Chennai),(Rex, Mumbai)]

正常组合,我能够生成12,但应用约束后我无法生成。请提出你的解决方案


2条回答
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))

您可以进行交叉连接,然后手动筛选出行

假设您的数据帧如下所示

     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')]

相关问题 更多 >