从熊猫数据框中检索非零列作为字典

Ahm*_*tin 5 python-3.x pandas

给定一个如下所示的数据框

            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
Run Code Online (Sandbox Code Playgroud)

我想以字典格式获取给定行的大于零的列值。例如,对于仓鼠线,结果应该是:

{ 'hamster': 1, 'dolphin': 0.5 }
Run Code Online (Sandbox Code Playgroud)

不过,省略具有相同名称的列会更好,因此对于“仓鼠”,这会更好:

{ 'dolphin': 0.5 }
Run Code Online (Sandbox Code Playgroud)

目前,我使用df["hamster"].to_dict()字典理解来接收给定行的所有值并删除零值,例如{k: v for (k,v) in d.items() if v > 0 },但它远非理想,因为数据帧的原始大小约为 50000 x 50000。在 Pandas 中是否有更简单的过滤方法删除值为 0 的列(以及具有相同名称的列,如果这很容易的话)?

Vai*_*ali 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}
Run Code Online (Sandbox Code Playgroud)

或者你可以将上面的系列转换为以索引为键的字典,

df.apply(lambda x: x[(x!=0) & (x.keys()!=x.name)].to_dict()).to_dict()
Run Code Online (Sandbox Code Playgroud)

你得到,

 {'cat': {'dog': 0.5, 'dolphin': 0.25},
 'dog': {'cat': 0.5},
 'hamster': {'dolphin': 0.5},
 'dolphin': {'cat': 0.25, 'hamster': 0.5}}
Run Code Online (Sandbox Code Playgroud)

如果您关注的是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}}
Run Code Online (Sandbox Code Playgroud)

您可以显式指定 orient 参数

df.to_dict('index')
Run Code Online (Sandbox Code Playgroud)