Pandas list of tuples from two columns containing list

Viewed 755

I have a pandas dataframe like this where both device_names and device_models are list

user_id, device_names, device_models
1, ["dev_1", "dev_2"], ["mod_1", "mod_2"]
2, ["dev_1", "dev_5"], ["mod_1", "mod_5"]

I want two combine these two columns and create a another column like this

user_id, device_names, device_models, dev_mod
1, ["dev_1", "dev_2"], ["mod_1", "mod_2"], [("dev_1", "mod_1"), ("dev_1", "mod_2")]
2, ["dev_1", "dev_5"], ["mod_1", "mod_5"], [("dev_1", "mod_1"), ("dev_5", "mod_5")] 

I have tried with trivial zip which works for normal list but doesn't work for pandas series. How Can I do that in pandas?

2 Answers

You could do this:

import pandas as pd
df = pd.DataFrame({'user_id': {0: 1, 1: 2},
 'device_names': {0: ["dev_1","dev_2"], 1: ["dev_1","dev_5"]},
 'device_models': {0: ["mod_1","mod_2"], 1: ["mod_1","mod_5"]}})

df['dev_mod'] = df.apply(lambda x: list(zip(x['device_names'], x['device_models'])), axis=1)

Output:

   user_id    device_names   device_models                           dev_mod
0        1  [dev_1, dev_2]  [mod_1, mod_2]  [(dev_1, mod_1), (dev_2, mod_2)]
1        2  [dev_1, dev_5]  [mod_1, mod_5]  [(dev_1, mod_1), (dev_5, mod_5)]

A list comprehension with zipping:

df["dev_mod"] = [list(zip(dev_name, dev_model))
                 for dev_name, dev_model in zip(df.device_names, df.device_models)]

to get

   user_id    device_names   device_models                           dev_mod
0        1  [dev_1, dev_2]  [mod_1, mod_2]  [(dev_1, mod_1), (dev_2, mod_2)]
1        2  [dev_1, dev_5]  [mod_1, mod_5]  [(dev_1, mod_1), (dev_5, mod_5)]

Second zip glues two columns together, first one kind of transposes to get the desired result.

Related