我有两个系列,它们包含相同的元素,但顺序不同。我想根据第一个系列中的值以与第一个系列相同的顺序带来第二个系列,然后在对第二个系列进行重新排序后获得其索引。我该怎么办?
示例:
根据bar
中的值,按与foo
相同的顺序带来foo
,并返回重新排列的索引。
import pandas as pd
foo = pd.Series(['d','b','c','a'])
bar = pd.Series(['c','a','b','d'])
答案 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)
将searchsorted
与argsort
结合使用:
a = np.argsort(bar)
a[np.searchsorted(bar[a], foo)].values #.to_numpy()
array([3, 2, 0, 1], dtype=int64)
答案 3 :(得分:1)
一种方法是简单地将df.join
与reset_index
和set_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