2016-12-15 43 views
2

比方说,我有以下两个pandas.DataFramedf0df1筛选数据时,列匹配

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中的值)。

万一它很重要,我不能在DataFrame中有“重复”行:集合(A,B,C,大小写)在每个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 

注意我不希望得到的结果,其中只有一条线出现,也不会出现两行或多行显示同一个案例。

有什么建议吗?

回答

4

你可以做类似的事情。如果这不是你想要的(这里每个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 
+0

似乎很好。我尽快尝试。 – Simpom

+0

究竟需要什么!谢谢。 – Simpom