Python 基于查找df矩阵从一个df中获取行

Python 基于查找df矩阵从一个df中获取行,python,pandas,dataframe,Python,Pandas,Dataframe,我有两只熊猫。一个(DF1)包含关于每个名称中信息的实际“类型”的数据,第二个(DF2)包含名称中存在的“类型”。DF2不会包含来自DF1的所有名称。需要返回一个数据帧,其中DF1中的行满足DF2中的行 比如说,, DF1: DF2 a查找矩阵: Name a_1 a_2 a_3 a_n 0 1 0 1 0 0 1 2 1 0 1

我有两只熊猫。一个(DF1)包含关于每个名称中信息的实际“类型”的数据,第二个(DF2)包含名称中存在的“类型”。DF2不会包含来自DF1的所有名称。需要返回一个数据帧,其中DF1中的行满足DF2中的行

比如说,, DF1:

DF2 a查找矩阵:

       Name      a_1    a_2     a_3    a_n
    0  1         0       1       0      0 
    1  2         1       0       1      0 
    2  3         0       0       0      0 
DF2是列车/测试分割的结果矩阵。因此不包含完整的数据集。根据df中的名称,我需要从DF1中选择行

需要输出数据帧

DF类型A:

       Name      type           start         letter
    0  2         a_1            011           H
    1  2         a_3            012           I
    2  1         a_2            203           K
我试过用面具来做这个。但这似乎不是最有效的方法。我对使用熊猫还很陌生,觉得有更好的方法可以做到这一点。 我所尝试的:

type=df\u两列值
对于df_two.index.tolist()中的名称:
mask=df_one.type.apply(λx:any(如果x中有项目,则类型中的项目为项目))
掩码文件=(df_one['Name']。值==名称)和(掩码)
temp=df\U one[屏蔽文件]
这为每个名称提供了一个单独的数据帧,以后我必须合并它们。相当慢

是否有更好/有效的方法在熊猫身上实现这一点

编辑:a_1,…,a_n的值实际上是我的数据集中的uuid


编辑2:我太想概括这个问题了。将其清理到基本问题。

如果确实需要查找,则可以使用“取消堆栈”获取多索引项。然后通过过滤并在未堆叠的df2上右键连接df1,您将得到结果

result = pd.merge(pd.DataFrame(df2.unstack()), df1, left_index=True, right_on=['type', 'name'], how='left')

然后选择所需的列。

如果确实需要查找,则可以使用“取消堆栈”获取多索引项。然后通过过滤并在未堆叠的df2上右键连接df1,您将得到结果

result = pd.merge(pd.DataFrame(df2.unstack()), df1, left_index=True, right_on=['type', 'name'], how='left')
然后选择所需的列。

我会这样做:

首先,创建要与一起使用的数据帧


然后使用map创建一个附加列,其中包含1和0。然后只需选择值为1的行

df_filter=df1.copy()
df_filter['filter']=df2_mapper.lookup(df1['Name'],df1['type'])
df_filter=df_filter[df_filter['filter'].eq(1)]
print(df_filter)
   Name type  start letter  filter
0     2  a_1     11      H       1
1     2  a_3     12      I       1
2     1  a_2    203      K       1
3     2  b_1    943      P       1
4     5  b_3    925      L       1

最后,我认为可能有两种以上的类型,因此我决定建议您创建一个dataframe字典。其中每个数据帧对应于一个类型

groups=df_filter['type'].str.replace('(\d+)','').str.replace('_','')
df_types={i:group.reindex(columns=df1.columns) for i, group in df_filter.groupby(groups)}

显示和访问字典的数据帧

for _type in df_types:
    print(f'df_types[{_type}]')
    print(df_types[_type])
    print('-'*20)
输出

df_types[a]
   Name type  start letter
0     2  a_1     11      H
1     2  a_3     12      I
2     1  a_2    203      K
--------------------
df_types[b]
   Name type  start letter
3     2  b_1    943      P
4     5  b_3    925      L
--------------------
如果类型的数量只有两种,您只需执行以下操作: 我会这样做:

首先,创建要与一起使用的数据帧


然后使用map创建一个附加列,其中包含1和0。然后只需选择值为1的行

df_filter=df1.copy()
df_filter['filter']=df2_mapper.lookup(df1['Name'],df1['type'])
df_filter=df_filter[df_filter['filter'].eq(1)]
print(df_filter)
   Name type  start letter  filter
0     2  a_1     11      H       1
1     2  a_3     12      I       1
2     1  a_2    203      K       1
3     2  b_1    943      P       1
4     5  b_3    925      L       1

最后,我认为可能有两种以上的类型,因此我决定建议您创建一个dataframe字典。其中每个数据帧对应于一个类型

groups=df_filter['type'].str.replace('(\d+)','').str.replace('_','')
df_types={i:group.reindex(columns=df1.columns) for i, group in df_filter.groupby(groups)}

显示和访问字典的数据帧

for _type in df_types:
    print(f'df_types[{_type}]')
    print(df_types[_type])
    print('-'*20)
输出

df_types[a]
   Name type  start letter
0     2  a_1     11      H
1     2  a_3     12      I
2     1  a_2    203      K
--------------------
df_types[b]
   Name type  start letter
3     2  b_1    943      P
4     5  b_3    925      L
--------------------
如果类型的数量只有两种,您只需执行以下操作:
我刚意识到在重读这个问题时,我会得到类似的回答。对问题进行了编辑。这些类型实际上是我的数据集中的uuid值。@JayPatel什么是uuid?像一个更大的群体中的子群体?在这种情况下,您有一个从groupname到subgroups的字典映射?我一有机会就会测试它。将会更新!我刚意识到在重读这个问题时,我会得到类似的回答。对问题进行了编辑。这些类型实际上是我的数据集中的uuid值。@JayPatel什么是uuid?像一个更大的群体中的子群体?在这种情况下,您有一个从groupname到subgroups的字典映射?我一有机会就会测试它。将会更新!如果它们是uuid的?你会如何将它们分为a型和b型?公平点。我有一个UUID到type的映射,我用它从DF2中选择那些列。然后又碰到了主要问题。起初我试图把这个问题概括得太多了。将问题更新为我面临的主要问题。UUID通常是唯一的。类型列中的所有值都是唯一的还是可以重复?因为在您的示例中,
a_1
出现两次。@RithinChalumuri uuid是来自另一个db表的引用。名称和类型不是一对一。此DF仅表示DocumentName具有类型标签(uuid)和关于标签的必需信息(字母、开始等)。这样他们就可以重复!为什么索引
0,1,2
在预期输出数据帧中,而不是索引
3,4
。您的输入和预期的输出帧之间的相关性是什么?如果它们是uuid的?你会如何将它们分为a型和b型?公平点。我有一个UUID到type的映射,我用它从DF2中选择那些列。然后又碰到了主要问题。起初我试图把这个问题概括得太多了。将问题更新为我面临的主要问题。UUID通常是唯一的。类型列中的所有值都是唯一的还是可以重复?因为在您的示例中,
a_1
出现两次。@RithinChalumuri uuid是来自另一个db表的引用。名称和类型不是一对一。此DF仅表示DocumentName具有类型标签(uuid)和关于标签的必需信息(字母、开始等)。这样他们就可以重复!为什么索引
0,1,2
在预期输出数据帧中,而不是索引
3,4
。你的输入和预期的输出帧之间有什么关联?完美:)我希望你的评论完美:)我希望你的评论