我有一个这样的数据框:
A B C D
b 3 3 4
a 1 2 1
a 1 2 1
d 4 4 1
d 1 2 1
c 4 5 6
现在,我希望根据A列中的值对行进行重新排序。
我不想对值进行排序,而是按特定顺序对它们重新排序,例如['b', 'd', 'c', 'a']
我期望的是:
A B C D
b 3 3 4
d 4 4 1
d 1 2 1
c 4 5 6
a 1 2 1
a 1 2 1
答案 0 :(得分:4)
这是pd.Categorical
的一个好用例,因为您已经订购了类别。只需将该列设为分类并标记ordered=True
即可。然后,sort_values
应该完成其余的工作。
df['A'] = pd.Categorical(df.A, categories=['b', 'd', 'c', 'a'], ordered=True)
df.sort_values('A')
如果要保持列不变,可以只使用loc
和索引。
df.loc[pd.Series(pd.Categorical(df.A,
categories=['b', 'd', 'c', 'a'],
ordered=True))\
.sort_values()\
.index\
]
答案 1 :(得分:1)
使用字典这样的字典进行字符串排序,然后对值进行排序并重新索引:
order = ['b', 'd', 'c', 'a']
df = df.reindex(df['A'].map(dict(zip(order, range(len(order))))).sort_values().index)
print(df)
A B C D
0 b 3 3 4
3 d 4 4 1
4 d 1 2 1
5 c 4 5 6
1 a 1 2 1
2 a 1 2 1
答案 2 :(得分:1)
在不更改A数据类型的情况下,您可以将“ A”设置为索引,并按sk定义的所需顺序选择元素。
sk = ['b', 'd', 'c', 'a']
df.set_index('A').loc[sk].reset_index()
或使用临时列进行排序:
sk = ['b', 'd', 'c', 'a']
(
df.assign(S=df.A.map({v:k for k,v in enumerate(sk)}))
.sort_values(by='S')
.drop('S', axis=1)
)
答案 3 :(得分:1)