【问题标题】:Pandas dataframe into sparse dictionary of dictionaries将 Pandas 数据框转换为稀疏字典
【发布时间】:2016-08-03 19:38:04
【问题描述】:

如何将 pandas 数据帧转换为 sparse 字典字典,其中仅显示某些截止的索引。在下面的玩具示例中,我只想要值 > 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 字典,但我想在同一步骤中进行转换,因为之后的处理涉及迭代非常大的字典。这可以在 pandas 中完成吗?

【问题讨论】:

  • This 你应该会感兴趣。

标签: python dictionary pandas


【解决方案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}}

第 3 行和第 4 行灵感来自 here,请查看。

【讨论】:

    【解决方案2】:

    此结果使用字典推导来生成结果。对于cell_1cell_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}}
    

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

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

    【讨论】:

    • 这行得通,但for 循环让这真的很慢。是否可以使用屏蔽和聚合来仅查找 True
    猜你喜欢
    • 2020-04-07
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 2016-09-19
    • 2019-02-22
    • 2017-07-16
    • 2020-12-22
    相关资源
    最近更新 更多