给定一个如下所示的数据框
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 的列(以及具有相同名称的列,如果这很容易的话)?
您可以应用 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)
| 归档时间: |
|
| 查看次数: |
103 次 |
| 最近记录: |