2017-07-20 653 views
1

有點新的python,有這個算法,我試圖從df1中提取基於查找df2的值(它具有目標值)。Pandas Dataframe根據查找數據框中的值選擇行,然後根據列值選擇另一個條件

 
df 1 
A  B  C D 
a  b  10 2 
a  a  20 4 
b  a  40 10 
a  b  5 5 
b  a  10 1 
 
df 2 
A  B  C 
a  b  15 
a  a  30 
b  a  20 
z  x  5 
x  y  10 

需要基於在DF2值DF1這意味着 在使用查找DF2爲COL [返回行是否爲COL [A,B]的值[C]是小於值[C] A,B]

因此,閱讀DF1 - 第1行 - 我得到a,b和c = 10 - 使用它來查找a,b在DF2中的限制,其中Col [c]的值爲15 - so將此行添加到新的DF ..但是當我讀取第4行是b,ac = 40,這更多是df2 [b,a] c = 15 - 對於該行如此錯誤。

所以返回DF應

 
df 1 
A  B  C D 
a  b  10 2 
a  a  20 4 
a  b  5 5 
b  a  10 1 

我把它實現,但是看起來很簡陋,也有可能非常有效的兩種。任何建議..我希望能使用df1.apply和lambda但不是很確定如何。但是,如果有更好的方法可以提出您的意見。

此片段展示了我是如何能夠得到它的工作 - 而不是

 __sdf = pd.DataFrame({'A': list('aaabbbcccc'), 'B': list('ababsbcdcd'), 'c': range(10), 'd': range(0, 20, 2), 
           'g': [1] * 3 + [2] * 3 + [3] * 4}) 
     print "orig : \n {0}".format(__sdf) 
     __qf = pd.DataFrame({'A': list('aaabbczz'), 'B': list('abybsdxy'), 'c': list('23567894')}) 
     print "qf : \n {0}".format(__qf) 
     keys = ['A', 'B'] 
     col_c = 'c' 
     i1 = __sdf.set_index(keys).index 
     i2 = __qf.set_index(keys).index 
     __relevant_qf = __qf[i2.isin(i1)] 
     print "relevant qf : \n {0}".format(__relevant_qf) 

     i10 = __sdf.set_index(keys).index 
     __new_df = pd.DataFrame() 
     for idx, row in __relevant_qf.iterrows(): 
      data = [] 
      __q_val = float(row['c']) 
      data.append(row[keys]) 
      __res_df = pd.DataFrame(data) 
      i20 = __res_df.set_index(keys).index 
      __sub_df = __sdf[i10.isin(i20)] 
      print "__sub_df : \n {0}".format(__sub_df) 
      __sub_df = __sub_df.loc[__comp(__sub_df[col_c], __q_val)] 
      print "filtered __sub_df : \n {0}".format(__sub_df) 
      __new_df = __new_df.append(__sub_df) 
     print "__new_df : \n {0}".format(__new_df) 
+0

您是否試圖在兩個數據框上進行連接? – Gayatri

+0

你的解釋不清楚。請製作[mcve]。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ我用示例代碼 – Abhi

回答

0

我給你我的輸入根據該結果,你希望看到的最優解:

盡你所能do是合併,然後過濾它。

data = pd.merge(df1,df2,on=['A','B']) 
data = data[data['C_x']<data['C_y']] 
data = data[['A','B','C_x','D']] 

結果

A B C_x D 
0 a b 10 2 
1 a b 5 5 
2 a a 20 4 
4 b a 10 1 

難道這就是你期待嗎?

+0

更新了它,謝謝@Gayatri。由於某種原因,過濾器不適用於我 - data = data [data ['C_x'] Abhi

+0

你能看到合併後的列C_x和C_y嗎? – Gayatri

+0

如果它們是int64,還檢查列的數據類型。 – Gayatri