Greg
Greg

Reputation: 27

Pandas to dict conversion with condition

My dataframe:

data_part = [{'Part': 'A', 'Engine': True, 'TurboCharger':  True, 'Restricted': True},
    {'Part': 'B', 'Engine': False, 'TurboCharger': True, 'Restricted': False},]

My expect output is this:

{'A': {'Engine': 1, 'TurboCharger': 1, 'Restricted': 1},
 'B': {'TurboCharger': 1}}

This is what I am doing:

df_part = pd.DataFrame(data_part).set_index('Part').astype(int).to_dict('index')

This is what it gives:

{'A': {'Engine': 1, 'TurboCharger': 1, 'Restricted': 1},
 'B': {'Engine': 0, 'TurboCharger': 1, 'Restricted': 0}}

Anything that can be done to reach expected output?

Upvotes: 0

Views: 96

Answers (3)

jsmart
jsmart

Reputation: 3001

Here's a way to convert the list to a dict without pandas:

from pprint import pprint
data_2 = dict()

for dp in data_part:
    ts = [(k, v) for k, v in dp.items()]
    key = ts[0][1]
    values = {k: int(v) for k, v in ts[1:] if v}
    data_2[key] = values
    
pprint(data_2)

{'A': {'Engine': 1, 'Restricted': 1, 'TurboCharger': 1},
 'B': {'TurboCharger': 1}}

Upvotes: 1

Andy L.
Andy L.

Reputation: 25239

You may call agg before to_dict

df_part = (pd.DataFrame(data_part).set_index('Part')
                                  .agg(lambda x: dict(x[x].astype(int)), axis=1)
                                  .to_dict())

Out[60]:
{'A': {'Engine': 1, 'Restricted': 1, 'TurboCharger': 1},
 'B': {'TurboCharger': 1}}

Upvotes: 1

BENY
BENY

Reputation: 323226

We can fix your output

d=pd.DataFrame(data_part).set_index('Part').astype(int).stack().loc[lambda x : x!=0].reset_index('Part').groupby('Part').agg(dict)[0].to_dict()
Out[192]: 
{'A': {'Engine': 1, 'TurboCharger': 1, 'Restricted': 1},
 'B': {'TurboCharger': 1}}

Upvotes: 1

Related Questions