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

时间:2020-05-18 11:55:10

标签: python python-3.x pandas

我有两列,例如:

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,但是在应用约束之后我无法生成。请提出您的解决方案。

2 个答案:

答案 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))
相关问题