从字典在数据框中创建分类变量

Create a categorical variable in dataframe from dictionary

将包含类别编号的字典转换为 Dataframe 中的列的最佳方法是什么?

字典中类别的数量是可变的,但是字典中每个值的总和等于数据框的长度。

唯一重要的方面是保持类别的正确顺序。先是 A,然后是 B,依此类推...

这是我的情况:

import pandas as pd
import numpy as np

# I have dictionaries with categorical data
dic = {"A":2 , "B": 3 , "C" : 1, "D" : 3 }

# And a separate dataframe with data
df = pd.DataFrame(np.random.rand(9,2), columns=['x','y'])

# For my data this test should always be true
sum(list(dic.values())) == len(df)

我想创建一个新列 df['Cat'],它从字典中捕获类别并保持相同的顺序。例如。最终输出将如下所示:

IN: df
OUT:
    x           y           Cat
0   0.741620    0.319183    A
1   0.908586    0.547509    A
2   0.767401    0.106174    B
3   0.315343    0.236445    B
4   0.774537    0.415653    B
5   0.306377    0.721040    C
6   0.114037    0.751824    D
7   0.580801    0.869796    D
8   0.413643    0.980575    D

这是一种方法。为清楚起见,将列表理解部分分为两部分:

dic = {"A":2 , "B": 3 , "C" : 1, "D" : 3 }

l1 = [[k] * v  for k, v in dic.items()]
l2 = [i for l in l1 for i in l]
df["Cat"] = pd.Series(l2, dtype="category")

输出为:

          x         y Cat
0  0.741620  0.319183   A
1  0.908586  0.547509   A
2  0.767401  0.106174   B
3  0.315343  0.236445   B
4  0.774537  0.415653   B
5  0.306377  0.721040   C
6  0.114037  0.751824   D
7  0.580801  0.869796   D
8  0.413643  0.980575   D