对于具有一列键和一列值的熊猫数据框,请制作另一列字典

时间:2019-09-24 07:08:58

标签: python pandas dictionary

我有以下数据框:

    c1  c2          freq
0   a   [u]         [4]
1   b   [x, z, v]   [8, 3, 15]

我想让另一列“ dict”这样

    c1  c2          freq         dict
0   a   [u]         [4]          {'u':4}
1   b   [x, z, v]   [8, 3, 15]   {'x':8, 'z':3, 'v':15}

我正在尝试以下代码:d["dict"] = d.apply(lambda row: dict(zip(row["c2"], row["freq"]))),但这会出现错误: KeyError: ('c2', u'occurred at index c1')

不确定我在做什么错。整个练习是我定义了一个全局字典,如下所示:{"u":4, "v":15, "x":8, "z":3},而我的初始数据帧是:

    c1  c2
0   a   u
1   b   [x, z, v]

其中[x, z, v]是一个numpy数组。对于每一行,我想保留全局字典中具有最高值的前2个元素(如果是数组),因此对于第二行,我将保留xv。为此,我将c2列的每个元素转换为一个列表,创建了一个具有各自频率的新列,现在想转换为字典,以便按值对它进行排序。然后,我将保留该行字典的前2个键。

d["c2"] = d["c2"].apply(lambda x: list(set(x)))
d["freq"] = d["c2"].apply(lambda x: [c[j] for j in x])
d["dict"] = d.apply(lambda row: dict(zip(row["c2"], row["freq"])))

第三行引起问题。另外,如果有一种更有效的方法来完成整个过程,那么我也很乐意提供任何建议。谢谢!

2 个答案:

答案 0 :(得分:5)

使用列表理解:

df['dict'] = [dict(zip(a,b)) for a, b in zip(df['c2'], df['freq'])]
print (df)
  c1         c2        freq                       dict
0  a        [u]         [4]                   {'u': 4}
1  b  [x, z, v]  [8, 3, 15]  {'x': 8, 'z': 3, 'v': 15}

或者在您的解决方案中添加axis=1用于每行处理:

df["dict"] = df.apply(lambda row: dict(zip(row["c2"], row["freq"])), axis=1)

答案 1 :(得分:1)

通过使用内置key的{​​{1}}和reverse参数,可以更轻松地解决核心问题。您只需准备一个部分函数并将其与方法链接样式中的首选子集函数一起映射到列上即可:

sorted