2015-09-27 99 views
3

我有两个数据帧。我的第一个数据框有两列,我想用它创建一个条件并从第二个数据框返回一个值。在数据框中查找匹配条件的第一行

df1 = (['a', 'a', 'b', 'c'], [0.4, 0.9, 0.1, 0.6]) 

df2 = (['a', 'a', 'b', 'b', 'c', 'c'], [0.2, 0.6, 0.3, 0.8, 0.1, 0.4], 
       [500, 200, 900, 400, 250, 800]) 

对于df1中的每一行,我想通过两列数据查找df2。第一个条件是将df1中的字母与df2相匹配。第二个条件是查找df2中数字大于df1的第一个数字行。如果没有数字更大,则采用与该字母匹配的df2中的第一行。

我的目标输出是:

  • DF1行[0] = 500# '一个' 匹配 '一' & 0.4大于0.2
  • DF1行[1] = 200# 'A'匹配 '一个' & 0.9大于0.6
  • DF1行[2] = 900# 'b' 匹配 'b' &没有行大于0.1,以便返回第一 'b' 行
  • DF1行[3] = 800#'c'匹配'c'& 0.6大于0.4

对于我的问题任何不良格式的道歉,请提供任何关于发布(它是我的第一个)的建议。

非常感谢!

回答

1

您可以迭代df1并根据第0列字母进行选择,并且比两列之间的比较大1。假定列1的值为升序,如果所选数据框不为空,则存储列的最后一个值2.如果为空,则获得与列0选择匹配的df2 col 2的第一个值。

下面是一个例子,我将结果存储在一个词典中。

例子:

你的数据

import pandas as pd 

df1 = pd.DataFrame(data = [['a', 'a', 'b', 'c'], [0.4, 0.9, 0.1, 0.6]]).transpose() 

df2 = pd.DataFrame(data = [['a', 'a', 'b', 'b', 'c', 'c'], [0.2, 0.6, 0.3, 0.8, 0.1, 0.4], [500, 200, 900, 400, 250, 800]]).transpose() 

迭代:

results = {} # dictionnary to store results 

for i, row in df1.iterrows(): 
    select = df2[(df2[0] == row[0]) & (df2[1] < row[1])] # selection 

    if not select.empty: 
     results[i] = select[2].iloc[-1] # storing last value of column 2 
    else: 
     results[i] = df2[df2[0] == row[0]][2].iloc[0] # storing first value if no greater than match 

print results # {0: 500, 1: 200, 2: 900, 3: 800} 
+0

谢谢您快速回答,这很好地解决了我的问题。 – crt

3

我觉得更好的是避免重复。
我把df1df2的数据合并在一起列a。输出的行数为原始df1的两倍。然后通过np.where应用条件,并将输出转换为整数。系列s包含输出,每个奇数值。 (因为合并与df1一个行与df2两行)

# a b 
#0 a 0.4 
#1 a 0.9 
#2 b 0.1 
#3 c 0.6 

# a c d 
#0 a 0.2 500 
#1 a 0.6 200 
#2 b 0.3 900 
#3 b 0.8 400 
#4 c 0.1 250 
#5 c 0.4 800 

#merged data - intersection df1 and df2 by column a 
df = pd.merge(df1, df2, on=['a'], how='inner') 
#apply condition 
s = np.where(df['c']< df['b'], df['d'], df['d'].shift(1)).astype('int') 
#odd values 
s = s[1::2] 
#[500 200 900 800] 

#if need add data do df1 as column e 
#df1['e'] = pd.Series(s, index=df1.index) 

迭代溶液(Delforge):

100 loops, best of 3: 4.67 ms per loop 

合并后的解决方案(我):

100 loops, best of 3: 1.93 ms per loop 
+0

谢谢jezrael,我一直在玩你的解决方案,它看起来非常好。关于您的最后一行代码,您会查找奇数值以将数据添加回原始数据框。我正在使用的实际数据具有不同的每个元素的长度(因为我可能在列c中有三个值,a列中的一个元素和五列中的另一个元素)。查找您存储在s中的结果并将它们添加回df1的好方法是什么?再次感谢你的帮助。 – crt

相关问题