Shi*_*ari 1 python dictionary pandas
我有以下数据框:
c1 c2 freq
0 a [u] [4]
1 b [x, z, v] [8, 3, 15]
Run Code Online (Sandbox Code Playgroud)
我想获得另一列“ 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}
Run Code Online (Sandbox Code Playgroud)
我正在尝试此代码: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]
Run Code Online (Sandbox Code Playgroud)
其中[x, z, v]是一个numpy数组。对于每一行,我想保留全局字典中具有最高值的前2个元素(如果是数组),因此对于第二行,我将保留x和v。为此,我将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"])))
Run Code Online (Sandbox Code Playgroud)
第三行引起了问题。另外,如果有一种更有效的方法来完成整个过程,那么我会很乐意提供任何建议。谢谢!
使用清单理解:
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}
Run Code Online (Sandbox Code Playgroud)
或者在您的解决方案中添加axis=1按行处理:
df["dict"] = df.apply(lambda row: dict(zip(row["c2"], row["freq"])), axis=1)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
36 次 |
| 最近记录: |