2

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?

Rafiul Sabbir
  • 626
  • 6
  • 21
  • 3
    Does this answer your question? [How to form tuple column from two columns in Pandas](https://stackoverflow.com/questions/16031056/how-to-form-tuple-column-from-two-columns-in-pandas) – Yehuda May 05 '21 at 15:16
  • @Yehuda, I have seen this answer. It works for two columns with string, I want the same for two columns with list. – Rafiul Sabbir May 05 '21 at 15:17

2 Answers2

4

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)]
Andreas
  • 8,694
  • 3
  • 14
  • 38
4

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.

Mustafa Aydın
  • 17,645
  • 4
  • 15
  • 38