如何根据列中的值对数据框的行进行重新排序

时间:2020-04-21 03:42:15

标签: python pandas

我有一个这样的数据框:

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

4 个答案:

答案 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)

我正在进一步solution提供的rafaelc。如果要按链式进行,请按以下步骤操作:

 $invoice = Invoice::findOrFail($invoice_id)->first();
 event(new InvoiceEmailSentEvent($invoice));
相关问题