熊猫到条件转换字典

时间:2020-07-30 18:30:13

标签: pandas

我的数据框:

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

我的期望输出是这样:

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

这就是我在做什么:

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

这就是它的作用:

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

可以做些什么来达到预期的输出?

3 个答案:

答案 0 :(得分:1)

我们可以修复您的输出

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}}

答案 1 :(得分:1)

您可以在agg之前致电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}}

答案 2 :(得分:1)

这是一种将列表转换为不带大熊猫的字典的方法:

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}}