要获得您提供的确切答案,包括否定案例的条目,您必须提前创建一个所有可能的数据框Id和Categories值。一分耕耘一分收获!
让我们来看看我的解决方案,从导入开始:
In [1]: from itertools import product # will compute Id/Category possibilities
In [2]: import pandas as pd
创建您的示例数据框
In [3]: df1 = df1 = pd.DataFrame(data={'Id': [1, 1, 2, 2, 2], 'CategoryId': ['A', 'B', 'A', 'E', 'F
...: ']})[['Id', 'CategoryId']]
In [4]: df1
Out[4]:
Id CategoryId
0 1 A
1 1 B
2 2 A
3 2 E
4 2 F
您必须在此处提供“Id”和“CategoryId”列的可能值
# the ids you showed
In [5]: ids = range(1, 3) # gives [1, 2]
# Either manually create the category values...
In [6]: cats = ['A', 'B', 'C', 'D', 'E', 'F']
# Or get jiggy with some Python to be more flexible:
In [7]: cats = [chr(c) for c in range(ord('A'), ord('F') + 1)]
知道了每一列的可能值,我们现在可以计算所有可能的组合:
In [8]: possibilities = list(product(ids, cats))
In [9]: possibilities
Out[9]:
[(1, 'A'),
(1, 'B'),
(1, 'C'),
(1, 'D'),
(1, 'E'),
(1, 'F'),
(2, 'A'),
(2, 'B'),
(2, 'C'),
(2, 'D'),
(2, 'E'),
(2, 'F')]
Id接下来,我们可以使用可能的值和值预分配结果表Category:
In [8]: results = pd.DataFrame(index=ids, columns=cats).fillna(0)
In [9]: results
Out[9]:
A B C D E F
1 0 0 0 0 0 0
2 0 0 0 0 0 0
我用值预先填充了数据框0——你可以使用'N'.
现在,检查每个可能的组合是否出现并results用您想要的值填充数据框中的对应单元格是一件简单的事情(我使用1- 你可以做到'Y')
In[10]: for i in list(df1.itertuples()):
if (i.Id, i.CategoryId) in possibilities:
results.loc[i.Id, i.CategoryId] = 1
检查输出:
In [11]: results
Out[11]:
A B C D E F
1 1 1 0 0 0 0
2 1 0 0 0 1 1
那是宾果游戏!