我有一个固定的数组,例如sort_by = [a,b,c,d,e,f]
。我的数据框看起来像这样,我把Column1
作为索引:
Column1 | Column2 | ...
d 1
d 2
b 3
a 4
a 5
b 6
c 7
我想从sort_by
列表中查找排序它们,然而,有时并非sort_by
的所有值都在Column
中,这导致索引未找到。我如何让它"尝试"?尽其所能?
s.set_index('mitre_attack_tactic', inplace=True)
print(s.loc[sort_by]) --> doesn't work
print(s.loc[[a,b,c,d]) --> does work however Column1 could have e,f,g
让我们试试pd.Categorical
out = df.iloc[pd.Categorical(df.Column1,['a','b','c','d']).argsort()]
Out[48]:
Column1 Column2
3 a 4
4 a 5
2 b 3
5 b 6
6 c 7
0 d 1
1 d 2
可以使用df.sort_values
的key
。我们的想法是从sort_by
列表创建一个值索引字典,然后将字典映射到列,并按结果索引排序。
key = {v:k for k, v in enumerate(sort_by)}
df = df.sort_values('Column1', key=lambda col: col.map(key))
print(df)
Column1 Column2
3 a 4
4 a 5
2 b 3
5 b 6
6 c 7
0 d 1
1 d 2
本页帮助:
如果您将sort_by
创建为分类:
sort_by = pd.api.types.CategoricalDtype(["a","b","c","d","e","f"], ordered=True)
然后将列更改为分类:
s['Column1'] = s['Column1'].astype(sort_by)
你可以对它进行排序:
s.sort_values('Column1')
index.intersection
df.loc[pd.Index(sort_by).intersection(df.index)]
Column2
a 4
a 5
b 3
b 6
c 7
d 1
d 2