Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用字典作为映射器创建熊猫系列_Python_Pandas_Dictionary - Fatal编程技术网

Python 使用字典作为映射器创建熊猫系列

Python 使用字典作为映射器创建熊猫系列,python,pandas,dictionary,Python,Pandas,Dictionary,是否有内置函数使用字典作为映射器和数据框中的索引级别创建pandas.Series列 其想法是基于索引级别中的值和字典创建一个新列。例如: 让我们假设以下数据帧,其中id、name和code以及索引中的不同级别 df col1 col2 id name code 0 a x 7 10 y 8 11 z 9 12

是否有内置函数使用字典作为映射器和数据框中的索引级别创建
pandas.Series

其想法是基于索引级别中的值和字典创建一个新列。例如:

让我们假设以下数据帧,其中
id
name
code
以及索引中的不同级别

df

                  col1    col2
id  name  code  
 0    a    x       7       10
           y       8       11
           z       9       12

 1    b    x       13      16
           y       14      17
           z       15      18
下面的字典
d={'a':{'y','z'},'b':{'x'}

新列的输出应如下所示:

                  col1    col2    new
id  name  code  
 0    a    x       7       10      0
           y       8       11      1
           z       9       12      1

 1    b    x       13      16      1
           y       14      17      0
           z       15      18      0
作为映射的结果,
new
=
1
如果
code
索引值在具有键
name
的值的字典列表中,则为
0

我试图手动创建此映射,但我不确定如何在索引级别上迭代

这是我迄今为止的尝试:

df['y'] = [1 if i in d[k] else 0 for k, v in d.items() for i
                 in df.index.get_level_values('code')]
但是我得到了下面的错误,这让我觉得我没有正确地迭代索引级别,或者没有按照预期与字典一起迭代

ValueError: Length of values does not match length of index

有什么建议吗?

将此选项用于您需要的新专栏:

df['new'] = [1 if j in d[i] else 0 for (i, j) in zip(df.index.get_level_values('name'), df.index.get_level_values('code'))]

以上@WebDev答案的超级非pythonic且低效的方法

k = list(zip(df.index.get_level_values('Brand'), 
df.index.get_level_values('Metric')))
tmp_list = [0]*df.shape[0]
for keys in d:
    for vals in d[keys]:
        for i,pairs in enumerate(k):
            if pairs[0] == keys and pairs[1] == vals:
                tmp_list[i] = 1
df['new'] = tmp_list