2016-12-15 64 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