martin
martin

Reputation: 1185

Can't create simple dict from data frame

I have a table looks that:

          0                   1
0   2760023     XXXXXXXXYYYY111
1   2760024     XXXXXXXXYYYY112
2   2760042     XXXXXXXXYYYY113
3   2760011     XXXXXXXXYYYY114
4   2760041     XXXXXXXXYYYY115
5   2760012     XXXXXXXXYYYY116
6   2760033     XXXXXXXXYYYY117

No headers. I need to create simple dict:

dict = {2760023:XXXXXXXXYYYY111, 
        2760024:XXXXXXXXYYYY112... etc.}

I read a lot of post on SO and docs, but the result for me is wrong... coz if I use a to_dict()(no matter what argument), as someone describe here:

26716616/convert-a-pandas-dataframe-to-a-dictionary

I got a not simple dict but:

    {0: {0: 2760023,
  1: 2760024,
  2: 2760042,
  3: 2760011,
  4: 2760041,
  5: 2760012,
  6: 2760033},
 1: {0: 'XXXXXXXXYYYY111',
  1: 'XXXXXXXXYYYY112',
  2: 'XXXXXXXXYYYY113',
  3: 'XXXXXXXXYYYY114',
  4: 'XXXXXXXXYYYY115',
  5: 'XXXXXXXXYYYY116',
  6: 'XXXXXXXXYYYY117'}}

So it kinda lists in the list? Can someone tell me what I did wrong?

P.S. table hase a data.frame type

Upvotes: 0

Views: 47

Answers (3)

Rajat Jain
Rajat Jain

Reputation: 2032

There is other way also:

{row[0]:row[1] for idx, row in df.iterrows()}

With timeit, we have below for all solutions:

In [6]: %timeit {row[0]:row[1] for idx, row in df.iterrows()}                   
629 µs ± 56.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [7]: %timeit dict(df.values)                                                                                                                                                                      
44.1 µs ± 2.78 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [8]: %timeit df.set_index('0').to_dict()['1']                                                                                                                                                     
347 µs ± 18.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Upvotes: 1

anky
anky

Reputation: 75100

If you just have 2 columns, you can also do:

dict(df.values)

{2760023: 'XXXXXXXXYYYY111',
 2760024: 'XXXXXXXXYYYY112',
 2760042: 'XXXXXXXXYYYY113',
 2760011: 'XXXXXXXXYYYY114',
 2760041: 'XXXXXXXXYYYY115',
 2760012: 'XXXXXXXXYYYY116',
 2760033: 'XXXXXXXXYYYY117'}

Upvotes: 1

U13-Forward
U13-Forward

Reputation: 71610

Don't use any arguments for to_dict:

>>> df.set_index('0').to_dict()['1']
{2760023: 'XXXXXXXXYYYY111', 2760024: 'XXXXXXXXYYYY112', 2760042: 'XXXXXXXXYYYY113', 2760011: 'XXXXXXXXYYYY114', 2760041: 'XXXXXXXXYYYY115', 2760012: 'XXXXXXXXYYYY116', 2760033: 'XXXXXXXXYYYY117'}
>>> 

Upvotes: 1

Related Questions