AlSub
AlSub

Reputation: 1155

How to properly apply a nested loop?

I want to print pandas-column-based concatenated strings.

To accomplish this I applied three for-loops to iterate over each element:

import pandas as pd

d = {'code': ['A180', 'A181'], 'company': ['XYZ', 'XYZ'], 'title':['vice president', 'vice president'], 'other_title':['sr vice president', 'sr vice president']}

df = pd.DataFrame(data=d)
cities = ["Buffalo", "Houston", "Boston"]


codes = df['code']
titles=df['title']

for city in cities:
    for title in titles:
        for code in codes:
             print(code+'-'+city+'-'+title)
            

Which output's print code option twice:

#A180-Buffalo-vice president
#A181-Buffalo-vice president
#A180-Buffalo-vice president
#A181-Buffalo-vice president
#A180-Houston-vice president
#A181-Houston-vice president
#A180-Houston-vice president
#A181-Houston-vice president
#A180-Boston-vice president
#A181-Boston-vice president
#A180-Boston-vice president
#A181-Boston-vice president

How to get just the concatenated string once? Something like this:

#A180-Buffalo-vice president
#A181-Buffalo-vice president
#A180-Houston-vice president
#A181-Houston-vice president
#A180-Boston-vice president
#A181-Boston-vice president

Upvotes: 0

Views: 66

Answers (2)

perl
perl

Reputation: 9941

But maybe you don't even need 3 loops:

from itertools import product

print('\n'.join([
    x[1][0]+'-'+x[0]+'-'+x[1][1]
    for x in product(cities, zip(d['code'], d['title']))]))

Output:

A180-Buffalo-vice president
A181-Buffalo-vice president
A180-Houston-vice president
A181-Houston-vice president
A180-Boston-vice president
A181-Boston-vice president

Upvotes: 2

Mayank Porwal
Mayank Porwal

Reputation: 34046

This is because df['title'] contains duplicates.

Use Series.unique to get only distinct values:

In [1446]: titles = df['title'].unique()

Then run your for loop:

In [1448]: for city in cities:
      ...:     for title in titles:
      ...:         for code in codes:
      ...:              print(code+'-'+city+'-'+title)
      ...: 
A180-Buffalo-vice president
A181-Buffalo-vice president
A180-Houston-vice president
A181-Houston-vice president
A180-Boston-vice president
A181-Boston-vice president

Upvotes: 1

Related Questions