在 Python 中使用 2 个数据帧查找

数据挖掘 Python 数据清理 数据框
2022-03-07 13:18:30

我有2个数据框:

df1

Id     CategoryId 
1       A
1       B
2       A
2       E
2       F

df2:

Id   A    B   C   D   E   F
1   
2    

我想做一个查找,这将帮助我根据 df1 的值填充 df2 中的值

如果 df1 具有 id = 1 和 CategoryId = A 那么我希望 df2 行 1 列 A 说 Y 否则 N

最终的 df2 应如下所示:

 Id   A    B   C   D   E   F
 1    Y    Y   N   N   N   N
 2    Y    N   N   N   Y   Y

我不确定如何在 Python 中执行此操作。我真的很感激这方面的任何帮助!

谢谢

2个回答

如果您有一个df1包含两列的数据框,Id并且CategoryId可以链接get_dummiesand groupby,例如

>>> df2 = df1['CategoryId'].str.get_dummies().groupby(df1['Id']).max()
>>> df2
    A  B  E  F
Id
1   1  1  0  0
2   1  0  1  1

这不是您想要的格式,但它避免了查找。

要获得您提供的确切答案,包括否定案例的条目,您必须提前创建一个所有可能的数据框IdCategories值。一分耕耘一分收获!

让我们来看看我的解决方案,从导入开始:

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

那是宾果游戏!