如何将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')
这给出了:
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
字典,但我想在同一步骤中进行转换,因为之后的处理涉及迭代非常大的字典。这可能在熊猫中完成吗?
答案 0 :(得分:2)
此结果使用字典理解来生成结果。对于Error: Exit with code 1 due to network error: TimeoutError
at Socket.<anonymous> (/srv/exporter/utils/wkhtmltopdf.js:117:19)
at Socket.g (events.js:260:16)
at emitOne (events.js:77:13)
at Socket.emit (events.js:169:7)
at readableAddChunk (_stream_readable.js:146:16)
at Socket.Readable.push (_stream_readable.js:110:10)
at Pipe.onread (net.js:523:20)
和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}}
答案 1 :(得分:1)
删除代码的最后一行并添加此代码。
from pandas import compat
def to_dict_custom(data):
return dict((k, v[v<0].to_dict()) for k, v in compat.iteritems(data))
dfasdict = to_dict_custom(df1)
print dfasdict
产生,
{'cell_2': {'gene_c': -1.0}, 'cell_1': {'gene_a': -1.0}}
受here启发的第3行和第4行请检查。