Convert pandas dataframe to tuple of tuples
Asked Answered
U

3

8

I have the following pandas dataframe df:

     Description    Code
0    Apples         014
1    Oranges        015
2    Bananas        017
3    Grapes         021

I need to convert it to a tuple of tuples, like this:

my_fruits = ( ('Apples', '014'), 
              ('Oranges', '015'), 
              ('Bananas', '017'), 
              ('Grapes', '021')
            )

Can you help me, please? I have tried the following code but it does not return what I really want:

list(zip(df.columns,df.T.values.tolist()))

Thanks in advance!!!

Unhesitating answered 17/8, 2018 at 14:37 Comment(0)
S
12

Would something like this work?

tuple(df.itertuples(index=False, name=None))
Shop answered 17/8, 2018 at 14:44 Comment(1)
I prefer this way because it is more generic and I do not need to hard code the column names. This should be the accepted answer.Extranuclear
L
3

You need to zip the two columns:

tuple(zip(df.Description, df.Code))
# (('Apples', 14), ('Oranges', 15), ('Bananas', 17), ('Grapes', 21))
Lynx answered 17/8, 2018 at 14:41 Comment(5)
Thank you!! It worked!! Do you know how I can remove the u sign before each string? it says u('Apples', u '014')Unhesitating
It just means your strings are in unicodeShop
You probably are using python 2. As commented @TheHCA, it indicates the strings are unicode. You can use this approach to convert unicode to ascii if you want them in ascii and don't mind losing some information on non-ascii characters. But generally you should be fine leaving the u alone.Lynx
@Psidom, I understood your point. However, it always fails because a tuple does not have that attribute encode/decode :(Unhesitating
You can't directly encode and decode a tuple; It has to be on the strings, something like tuple((x.encode('ascii'), y.encode('ascii')) for x, y in zip(df.Description, df.Code)).Lynx
R
0

Though it is not recommended for large dataframes, you can also use apply

import pandas as pd
df = pd.DataFrame([['Apples', '014'], 
                   ['Oranges', '015'],
                   ['Bananas', '017'],
                   ['Grapes', '021']], columns = ['Fruit', 'Value'])

my_fruits = tuple(df[['Fruit','Value']].apply(tuple, axis=1))
my_fruits

Giving:

(('Apples', '014'), ('Oranges', '015'), ('Bananas', '017'), ('Grapes', '021'))

Use df.columns instead of explicitly typing out the column names if you want it to be more generic.

Rudyrudyard answered 10/11, 2022 at 16:41 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.