Pandas将数据帧放入稀疏的字典词典中

Tho*_*hew 6 python dictionary pandas

如何将pandas dataFrame转换为字典的稀疏字典,其中仅显示某些截止的索引.在下面的玩具示例中,我只想要值> 0的每列的索引

import pandas as pd

table1 = [['gene_a', -1 , 1], ['gene_b', 1, 1],['gene_c', 0, -1]]
df1 = pd.DataFrame(table)
df1.columns = ['gene','cell_1', 'cell_2']
df1 = df1.set_index('gene')
dfasdict = df1.to_dict(orient='dict')
Run Code Online (Sandbox Code Playgroud)

这给出了:

dfasdict = {'cell_1': {'gene_a': -1, 'gene_b': 0, 'gene_c': 0}, 'cell_2': {'gene_a': 1, 'gene_b': -1, 'gene_c': -1}}

但是所需的输出是稀疏字典,其中只显示小于零的值:

desired = {'cell_1': {'gene_a': -1}, 'cell_2': {'gene_b': -1, 'gene_c': -1}}

我可以dfasdict在创建之后进行一些处理以更改字典,但我想在同一步骤中进行转换,因为之后的处理涉及迭代非常大的字典.这有可能在熊猫中完成吗?

Ale*_*der 2

此结果使用字典理解来生成结果。对于cell_1和中的每一列cell_2,它查找小于 ( lt) 零的列并将结果转换为字典。

>>> {col: df1.loc[df1[col].lt(0), col].to_dict() for col in ['cell_1', 'cell_2']}
{'cell_1': {'gene_a': -1}, 'cell_2': {'gene_c': -1}}
Run Code Online (Sandbox Code Playgroud)

为了帮助理解这里发生了什么:

>>> df1.loc['cell_1'].lt(0)
gene
gene_a     True
gene_b    False
gene_c    False
Name: cell_1, dtype: bool

>>> df1.loc[df1['cell_1'].lt(0), 'cell_1'].to_dict()
{'gene_a': -1}
Run Code Online (Sandbox Code Playgroud)