我需要匹配这两个不同大小的数据帧,得到匹配的字段,然后比较它是大还是小。
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中的成本。他们被排除在外。
也纠正了我上面的例子。
有什么想法吗?
答案 0 :(得分:2)
我认为id
列id2
和df2
NaN
replace
,set_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
。最后由gt
与any
进行比较并使用boolean indexing
:
// BAMainPage.php
session_start();
if (isset($_POST['username'])){
$_SESSION['username'] = $_POST['username'];
}