从Pandas数据框中提取非零列并转换为字典。

5

假设有如下的数据框

            cat        dog        hamster    dolphin
cat         1          0.5        0          0.25
dog         0.5        1          0          0
hamster     0          0          1          0.5
dolphin     0.25       0          0.5        1

我想要以字典格式获取给定行中大于零的列值。例如,对于仓鼠行,结果应为:
{ 'hamster': 1, 'dolphin': 0.5 }

不过,如果省略具有相同名称的列,这将更好。对于“hamster”,最好如下:

{ 'dolphin': 0.5 }

目前我使用 df["hamster"].to_dict() 获取给定行的所有值,并通过字典推导式去除零值,例如{k: v for (k,v) in d.items() if v > 0 }。但这远非理想,因为数据框的原始尺寸约为50000 x 50000。在pandas中是否有更简单的方法来筛选出值为0的列(以及名称相同的列,如果易于实现)?

1个回答

4
你可以使用 to_dict 来创建以每行为值的字典,并获得系列作为输出。
df.apply(lambda x: x[(x!=0) & (x.keys()!=x.name)].to_dict())

cat        {'dog': 0.5, 'dolphin': 0.25}
dog                         {'cat': 0.5}
hamster                 {'dolphin': 0.5}
dolphin    {'cat': 0.25, 'hamster': 0.5}

你可以将上面的序列转换成以索引为键的字典,

df.apply(lambda x: x[(x!=0) & (x.keys()!=x.name)].to_dict()).to_dict()

你会得到:

 {'cat': {'dog': 0.5, 'dolphin': 0.25},
 'dog': {'cat': 0.5},
 'hamster': {'dolphin': 0.5},
 'dolphin': {'cat': 0.25, 'hamster': 0.5}}

如果您使用 pandas 1.1.2 版本,可能会遇到以下问题。
{0: {'dog': 0.5, 'dolphin': 0.25},
 1: {'cat': 0.5},
 2: {'dolphin': 0.5},
 3: {'cat': 0.25, 'hamster': 0.5}}

您可以明确指定“orient”参数。

df.to_dict('index')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接