Python 当列匹配时,从两个DataFrame筛选数据

Python 当列匹配时,从两个DataFrame筛选数据,python,pandas,Python,Pandas,假设我有两个pandas.DataFrame,df0和df1: import pandas as pd # 1st data set dat0 = [['A0', 'B0', 'C0', 'case0', 1], ['A0', 'B2', 'C0', 'case0', 2], ['A1', 'B0', 'C0', 'case0', 3], ['A1', 'B1', 'C0', 'case0', 4], ['A0', 'B0', '

假设我有两个
pandas.DataFrame
df0
df1

import pandas as pd

# 1st data set
dat0 = [['A0', 'B0', 'C0', 'case0', 1],
        ['A0', 'B2', 'C0', 'case0', 2],
        ['A1', 'B0', 'C0', 'case0', 3],
        ['A1', 'B1', 'C0', 'case0', 4],
        ['A0', 'B0', 'C1', 'case0', 5]]
df0 = pd.DataFrame(dat0, columns=['colA', 'colB', 'colC', 'colCase', 'colVal'])

# 2nd data set
dat1 = [['A0', 'B1', 'C2', 'case1', 6],
        ['A0', 'B2', 'C2', 'case1', 7],
        ['A1', 'B0', 'C2', 'case1', 8],
        ['A2', 'B2', 'C2', 'case1', 9]]
df1 = pd.DataFrame(dat1, columns=['colA', 'colB', 'colC', 'colCase', 'colVal'])
我试图得到所有的行,对于每两列(A,B),case0和case1都有一个值(即每个DF中都有一个值)

如果有关系,我不能在数据帧中有“重复”行:集合(A、B、C、case)在每个DF中都是唯一的

因此,我希望得到一个如下代码:

# Merge the DataFrames
df = pd.concat([df0, df1])  # maybe concat is not a good starting point

for a in ['A0', 'A1', 'A2']:
    for b in ['B0', 'B1', 'B2']:
        table = my_great_function(df, a, b)
        if table:
            print '---'
            print table
并得到如下结果:

---
  colA colB colC colCase  colVal
1   A0   B2   C0   case0       2
1   A0   B2   C2   case1       7
---
  colA colB colC colCase  colVal
2   A1   B0   C0   case0       3
2   A1   B0   C2   case1       8
注意,我不希望在只有一行出现的情况下得到结果,也不希望在两行或多行出现在同一情况下得到结果


有什么建议吗?

你可以做类似的事情。如果不完全符合您的要求,则相应地修改条件(此处,每个g代表一个子数据帧,具有唯一的colA和colB组合):


看起来很棒。我会尽快尝试的。这正是我所需要的!谢谢。
for _, g in df.groupby(["colA", "colB"]):
    case_lst = g.colCase.tolist()
    if 'case0' in case_lst and 'case1' in case_lst:
        print("--------")
        print(g)

--------
  colA colB colC colCase  colVal
1   A0   B2   C0   case0       2
1   A0   B2   C2   case1       7
--------
  colA colB colC colCase  colVal
2   A1   B0   C0   case0       3
2   A1   B0   C2   case1       8