根据值将一个序列按另一个序列排序?

时间:2019-07-30 13:05:45

标签: python pandas

我有两个系列,它们包含相同的元素,但顺序不同。我想根据第一个系列中的值以与第一个系列相同的顺序带来第二个系列,然后在对第二个系列进行重新排序后获得其索引。我该怎么办?

示例:

根据bar中的值,按与foo相同的顺序带来foo,并返回重新排列的索引。

import pandas as pd

foo = pd.Series(['d','b','c','a'])
bar = pd.Series(['c','a','b','d'])

4 个答案:

答案 0 :(得分:3)

IIUC,您可以用其索引“交换”您的bar系列值,然后用foo中的值“ reindex”:

pd.Series(bar.index, index=bar).reindex(foo)

[出]

d    3
b    2
c    0
a    1
dtype: int64

答案 1 :(得分:2)

IIUC,您要对foo进行与bar相同的排序,然后返回foo的索引。

您可以使用pd.CategoricalDtype实现此目的:

import pandas as pd

foo = pd.Series(['d','b','c','a'])
bar = pd.Series(['c','a','b','d'])

bar_type = pd.CategoricalDtype(bar.unique(), ordered=True)

new_foo = foo.astype(bar_type).sort_values()
print(new_foo)

输出:

2    c
3    a
1    b
0    d
dtype: category
Categories (4, object): [c < a < b < d]

获取索引:

index_new_foo=new_foo.index
index_new_foo

输出:

Int64Index([2, 3, 1, 0], dtype='int64')

以防万一,我这样做是相反的:

import pandas as pd

foo = pd.Series(['d','b','c','a'])
bar = pd.Series(['c','a','b','d'])

foo_type= pd.CategoricalDtype(foo.unique(), ordered=True)
new_bar = bar.astype(foo_type).sort_values()
new_bar.index

输出:

Int64Index([3, 2, 0, 1], dtype='int64')

答案 2 :(得分:2)

searchsortedargsort结合使用:

a = np.argsort(bar)
a[np.searchsorted(bar[a], foo)].values #.to_numpy()

array([3, 2, 0, 1], dtype=int64)

答案 3 :(得分:1)

一种方法是简单地将df.joinreset_indexset_index结合使用:

foo1 = foo.reset_index().set_index(0)
bar1 = bar.reset_index()
bar1.columns = ['index2',0] #this is so column names don't overlap
foo2 = foo1.join(bar1.set_index(0)).sort_index()

这将为您提供值作为索引,然后每个数据帧提供一列以提供匹配的索引:

   index  index2
0               
a      3       1
b      1       2
c      2       0
d      0       3