gpt4 book ai didi

python - 将数据框内容映射和更新到部分字典

转载 作者:行者123 更新时间:2023-12-04 15:16:29 25 4
gpt4 key购买 nike

问题

以下数据帧 df

TypeATypeB 列:

   Mix             TypeA  TypeB
0 701 12,101,102 9.0
1 702 7,11,16 7.0
2 703 12,102,NaN,11,16 7.0
3 704 5,3,16 NaN
4 705 101,102,10,3,16 6.0

...需要映射到字典:

code_dict = {12: 'a', 102: 'b', 7: 'c', 11: 'd', 16: 'e', 5: 'f'}

期望的结果

   Mix             TypeA  TypeB
0 701 a,101,b 9
1 702 c,d,e c
2 703 a,b,NaN,d,e c
3 704 f,3,e NaN
4 705 101,b,10,3,e 6

所做的努力

尝试#1

认为 df 可以使用如下简单命令拆分、扩展并将 code_dict 映射到 df:

pd.concat([df.TypeA.str.split(',', expand=True), df.TypeB]).apply(lambda x: code_dict[x], 1)

...但它给出了 TypeError: 'Series' objects are mutable, thus they cannot be hashed

尝试#2

做了一个函数f:

def f(x):
try:
result = code_dict[x]
except KeyError:
result = x
return result

...并将其用作...

dfa = df.TypeA.str.split(',', expand=True).\
apply(pd.to_numeric, errors='coerce').applymap(f)

pd.concat([df.iloc[:, :2], dfa, df.TypeB.map(f)], axis=1)

...这接近于期望的结果,但不完全是那样。

查询

  1. 是否有一种矢量化的方法来替换/更新扩展的 df 而无需在函数 f 上使用 mapapplymap
  2. 为了获得预期的结果,我尝试使用 dfa 操作recs = [list(i.values()) for i in dfa.to_dict('records')]。这给出了如下列表列表:
[['a', 101, 'b', nan, nan], 
['c', 'd', 'e', nan, nan],
['a', 'b', nan, 'd', 'e'],
['f', 3, 'e', nan, nan],
[101, 'b', 10.0, 3.0, 'e']]

...而且我无法清除其中的 nan

有没有办法达到预期的效果?

最佳答案

我建议在这里使用 dict.get(key, key) 方法 - 它的工作方式类似于 d[key] 但如果没有匹配的原始值返回(第二个参数).

TypeA 列中是字符串,因此对于匹配,将字典的键转换为 string 并使用 splitjoin 返回,对于列 TypeB 使用原始字典,因为数字(如果也是字符串,使用 d):

code_dict = {12: 'a', 102: 'b', 7: 'c', 11: 'd', 16: 'e', 5: 'f'}
d = {str(k): v for k, v in code_dict.items()}

df.TypeA = df.TypeA.apply(lambda x: ','.join(d.get(y, y) for y in x.split(',')))
df.TypeB = df.TypeB.apply(lambda x: code_dict.get(x, x))
print (df)
Mix TypeA TypeB
0 701 a,101,b 9
1 702 c,d,e c
2 703 a,b,NaN,d,e c
3 704 f,3,e NaN
4 705 101,b,10,3,e 6

Is there a vectorized way to replace / update the expanded df without using map and applymap on function f ?

在我看来不是,因为这里的replace有问题,因为需要处理,之间的值。

To get to the desired result, I tried manipulate dfa using recs = [list(i.values()) for i in dfa.to_dict('records')].

有多种解法,可以查看this ,例如:

recs =[value[~np.isnan(value)] for value in recs]

关于python - 将数据框内容映射和更新到部分字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64238376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com