Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 在一个单独的表上排序而不合并结果?_Sorting_Join_Pandas_Dataframe - Fatal编程技术网

Sorting 在一个单独的表上排序而不合并结果?

Sorting 在一个单独的表上排序而不合并结果?,sorting,join,pandas,dataframe,Sorting,Join,Pandas,Dataframe,我有以下数据: fruit = pd.DataFrame({'fruit': ['apple', 'orange', 'apple', 'blueberry'], 'colour': ['red', 'orange', 'green', 'black']}) costs = pd.DataFrame({'fruit': ['apple', 'orange', 'blueberry'], 'cost': [

我有以下数据:

fruit = pd.DataFrame({'fruit': ['apple', 'orange', 'apple', 'blueberry'], 
                      'colour': ['red', 'orange', 'green', 'black']})

costs = pd.DataFrame({'fruit': ['apple', 'orange', 'blueberry'],
                      'cost': [1.7, 1.4, 2.1]})

我想要一份
costs
表中按
cost
排序的
fruit
表的副本,但不包括cost列。最好的方法是什么?如果在中间步骤中有一个连接就可以了-我最担心的是长期内存浪费。

我会进行左合并,然后进行argsort:

In [11]: fruit.merge(costs, how="left")
Out[11]:
   colour      fruit  cost
0     red      apple   1.7
1  orange     orange   1.4
2   green      apple   1.7
3   black  blueberry   2.1
注意:如果您使用了不同的索引(水果),它将被忽略/替换为
范围(0,len(水果))

现在使用iloc(按位置)而不是loc(按标签)重新排序

注意:左合并很重要,因为普通合并将更改顺序(!!)。它也更有效


另一种更清洁但效率更低的方法:

In [21]: fruit.merge(costs).sort("cost").loc[:, fruit.columns]
Out[21]:
   colour      fruit
2  orange     orange
0     red      apple
1   green      apple
3   black  blueberry

注意:在下一个panda中,
sort\u值
可能比
sort
更可取。

为什么不合并列,然后删除不需要的列

pd.merge(fruit , costs).sort_index(by = 'cost').drop('cost' , axis = 1 )

好的,
fruit.loc[fruit.merge(costs)['cost'].argsort().argsort()]
起作用,但也许有更好的方法?
In [21]: fruit.merge(costs).sort("cost").loc[:, fruit.columns]
Out[21]:
   colour      fruit
2  orange     orange
0     red      apple
1   green      apple
3   black  blueberry
pd.merge(fruit , costs).sort_index(by = 'cost').drop('cost' , axis = 1 )