尝试删除未找到列表索引的列



我有一个固定的数组,例如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_valueskey。我们的想法是从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

最新更新