我有一个数据场

import pandas as pd

df = pd.DataFrame({"type":  ["A" ,"A1" ,"A" ,"A1","B" ],
                  "group":  ["g1", "g2","g2","g2","g1"]})

我有一本字典

 dic ={"AlphaA": {"A":  {"g1":"A_GRP1",  "g2":"A_GRP2"},
                  "A1": {"g1":"A1_GRP1", "g2":"A1_GRP2"}},
       "AlphaB": {"B":  {"g1":"B_GRP1",  "g2":"B_GRP2"}},
      }

我必须创建一个列名"value",它将使用数据框架和字典并为其指定值

Conditions to be applied:

  1. 如果类型为"A"或"A1",则应参考字典键AlphaA,获取相应组的值,并将其分配给新列
  2. 如果类型为"B",则应参考字典键AlphaB并获得相应组的值

Example of row one:
type is "A" hence refering dictionary key "AlphaA"
group is "g1
therefore :

dictt["AlphaA"]["A"]["g1"]          #would be the answer  

Required Output

 final_df = pd.DataFrame({"type" :  ["A" ,"A1" ,"A" ,"A1","B" ],
                          "group":  ["g1", "g2","g2","g2","g1"],
                          "value":  ["A_GRP1", "A1_GRP2", "A_GRP2",
                                     "A1_GRP2", "B_GRP1"]})

I was able to achieve this using loops but its is taking lot of time,
hence looking for some speedy technique.

推荐答案

假设dic输入字典,您可以将字典值合并到单个字典中(借助ChainMap),转换为DataFrame,unstack转换为Series和merge:

from collections import ChainMap
s = pd.DataFrame(dict(ChainMap(*dic.values()))).unstack()

# without ChainMap
# d = {k: v for d in dic.values() for k,v in d.items()}
# pd.DataFrame(d).unstack()

out = df.merge(s.rename('value'), left_on=['type', 'group'], right_index=True)

输出:

  type group    value
0    A    g1   A_GRP1
1   A1    g2  A1_GRP2
3   A1    g2  A1_GRP2
2    A    g2   A_GRP2
4    B    g1   B_GRP1

Python相关问答推荐

从收件箱获取特定列中的重复行

当变量也可以是无或真时,判断是否为假

使用decorator 自动继承父类

情节生成的饼图文本超出页面边界

如何使用SubProcess/Shell从Python脚本中调用具有几个带有html标签的参数的Perl脚本?

计算相同形状的两个张量的SSE损失

使用Keras的线性回归参数估计

使用FASTCGI在IIS上运行Django频道

使用新的类型语法正确注释ParamSecdecorator (3.12)

Pystata:从Python并行运行stata实例

max_of_three使用First_select、second_select、

Pytest两个具有无限循环和await命令的Deliverc函数

如何从具有不同len的列表字典中创建摘要表?

从numpy数组和参数创建收件箱

如何在python xsModel库中定义一个可选[December]字段,以产生受约束的SON模式

将输入聚合到统一词典中

如果满足某些条件,则用另一个数据帧列中的值填充空数据帧或数组

如何使用Pandas DataFrame按日期和项目汇总计数作为列标题

在www.example.com中使用`package_data`包含不包含__init__. py的非Python文件

基于另一列的GROUP-BY聚合将列添加到Polars LazyFrame