匹配2个不同的数据帧以返回值,然后比较

时间:2016-06-08 16:15:28

标签: python pandas dataframe

我需要匹配这两个不同大小的数据帧,得到匹配的字段,然后比较它是大还是小。

df = pd.DataFrame({'first_name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],
        'id': ['a1', 'a2', 'a3', 'a4', 'a5'],
        'id2': ['', '', '', 'b1', 'b2'],
        'cost':[1,2,3,4,5]}, columns = ['first_name', 'id','id2','cost'])
df

    first_name  id  id2 cost
0   Jason   a1      1
1   Molly   a2      2
2   Tina    a3      3
3   Jake    a4  b1  4
4   Amy     a5  b2  5

df2 = pd.DataFrame({'id': ['a1', 'a2', 'a3','b1','b2','b3'],'cost':[1,2,3,4,6,6]},columns = ['id','cost'])
df2


id  cost
0   a1  1
1   a2  2
2   a3  3
3   b1  4
4   b2  3
5   b3  6

预期结果是:

first_name  id  id2 cost
0   Jason   a1      1
1   Molly   a2      2
2   Tina    a3      3
3   Jake    a4  b1  4

匹配id1和id2上的df,与id上的df2相比。虽然b2是id,但不包括在内,因为df2中匹配的成本大于df中的成本。

我尝试了以下方面的内容:

df[(df['id'].isin(df2['id']) == True) | (df['id2'].isin(df2['id']) == True)]

    first_name  id  id2 cost
0   Jason   a1      1
1   Molly   a2      2
2   Tina    a3      3
3   Jake    a4  b1  4
4   Amy a5  b2  5

我似乎也难以比较成本并排除那些小于匹配成本的成本。

这是一个例子,我正在制作的作品在df中有180万条记录,并与df2中的17万条记录相匹配。这里我比较了2列,但是我需要在df中匹配4列。

我希望这是有道理的,因为现在也考虑效率,将数据帧合并4次也没有意义。

另一个例子:

df

    first_name  id  id2 cost
0   Jason   a1      7
1   Molly   a2      2
2   Tina    a3      3
3   Jake    a4  b1  4
4   Amy     a5  b2  8

df2


id  cost
0   a1  6
1   a2  2
2   a3  3
3   b1  4
4   b2  6
5   b3  6

在上面的例子中,

预期结果将是:

first_name  id  id2 cost
1   Molly   a2      2
2   Tina    a3      3
3   Jake    a4  b1  4

所以a1,a2,a3,a4,b1和b2匹配,但因为a1和b2中的成本大于df2.cost中的成本。他们被排除在外。

也纠正了我上面的例子。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我认为idid2df2 NaN replaceset_index apply to_numeric将数字替换为mask = (~((df[['id','id2']].replace(df2.set_index('id')['cost']) .apply(pd.to_numeric, errors='coerce')) .gt(df.cost, axis=0)).any(1) ) print (mask) 0 True 1 True 2 True 3 True 4 False dtype: bool print (df[mask]) first_name id id2 cost 0 Jason a1 10 1 Molly a2 2 2 Tina a3 3 3 Jake a4 b1 4 。最后由gtany进行比较并使用boolean indexing

// BAMainPage.php
session_start();
if (isset($_POST['username'])){
    $_SESSION['username'] = $_POST['username'];
}