如何在 Python 中按多列对 Pandas DataFrame 进行排序

Posted

技术标签:

【中文标题】如何在 Python 中按多列对 Pandas DataFrame 进行排序【英文标题】:How to sort a Pandas DataFrame by multiple columns in Python with ordered number 【发布时间】:2021-11-21 04:04:28 【问题描述】:

我有一个包含 3 列的数据框。

Code Volume Trade Value
Apple 500 1000
Amazon 1000 500
Facebook 250 750
Samsung 100 1500

首先,我想按升序对卷列进行排序: False 表示从最大到最小。然后,创建名称为“Volume Order”的新列,并给出编号作为排序编号。其次,我想对 Trade Value 升序排序: False 表示从大到小。之后,创建名为“交易订单”的新列,并给出数字作为排序编号。但是,当我对交易值进行排序时,排序的交易量列的顺序会根据交易量顺序发生变化。最后,我有 2 个已排序的列和 2 个已排序的列。最后,我想通过对最多 2 个单独的列进行排序来排序并创建一个新的最后一列。(Volume Order- Trade Order)。

预期产出(当数量和交易价值按顺序排序时;

Code Volume Order Trade Order
Samsung 4 1
Apple 2 2
Facebook 3 3
Amazon 1 4

最终输出

Code Max Ordered Number Final Sorted Number
Samsung 4 1
Amazon 4 2
Facebook 3 3
Apple 2 4

注意:如果它们是相同的最大订购数,则交易价值将更重要,以较大的一个的压轴表示。例子;三星 4-4。但三星拥有最大的贸易订单。这就是为什么它作为最终排序数字较大的原因。

当我尝试这段代码时;我做不到。你能帮忙解决这个问题吗?

ordered = volume_df.sort_values(by=['Volume'], ascending=False,ignore_index=True)
ordered['Volume Order'] = ordered.index+1 
ordered = trade_value_df.sort_values(by=['Trade Value'], ascending=False,ignore_index=True)
ordered['Trade Order'] = ordered.index+1 

【问题讨论】:

第一个问题很努力!但是你能提供一个最小的例子来帮助我们重现代码吗?所以我们不必自己创建数据框 谢谢。我的数据框位于上面。如果您将代码复制到此示例中,我可以使用它。我真的需要帮助 "When I try this code; I can't make it"是什么意思? 您可以添加一些代码向我们展示您如何创建volume_dftrade_value_df :) 这是问题的数据框。 pd.DataFrame('Code' : ['Apple', 'Amazon', 'Facebook', 'Samsung'],'Volume' : [500, 1000, 250, 100],'Trade Value' : [1000, 500, 750, 1500]) 【参考方案1】:

而不是使用sort_values 和索引使用rank

df['Volume Order'] = df['Volume'].rank(ascending=False)
df['Trade Order']  = df['Trade'].rank(ascending=False)
df['Trade Order2']  = df['Trade'].rank(ascending=True)
df['Max Ordered Number']  = df[['Volume Order', 'Trade Order']].max(axis=1)
df['Final Sorted Number'] = df[['Max Ordered Number', 'Trade Order2']].apply(tuple, axis=1).rank(ascending=False)
df.drop('Trade Order2', axis=1)

输出:

       Code  Volume  Trade  Value  Volume Order  Trade Order  Max Ordered Number  Final Sorted Number
0     Apple     500   1000   <NA>             2            2                   2                    4
1    Amazon    1000    500   <NA>             1            4                   4                    2
2  Facebook     250    750   <NA>             3            3                   3                    3
3   Samsung     100   1500   <NA>             4            1                   4                    1

【讨论】:

@Bianconera 我使用了一个临时的“Trade Order2”列,它按照与“Max Ordered Number”相同的预期顺序排序 是的,它会的,这是在第一个键上排序,然后在第二个键上排序 @Bianconera 可能会开个新问题,作为 cmets 很难做后续 ***.com/questions/69375616/…你能帮帮我吗?【参考方案2】:

写的时候有问题:

ordered = trade_value_df.sort_values(by=['Trade Value'], ascending=False,ignore_index=True)

您正在为名称 ordered 分配新的东西,因此您实际上丢失了之前分配给该名称的数据框。

一种可能性是在同一个数据帧上执行所有操作,而不是拥有多个数据帧:

import pandas as pd

df = pd.DataFrame('Code':['Apple', 'Amazon', 'Facebook', 'Samsung'], 'Volume':[500, 1000, 250, 100], 'Trade Value': [1000, 500, 750, 1500])

df = df.sort_values(by=['Volume'], ascending=False,ignore_index=True)
df['Volume Order'] = df.index + 1

df = df.sort_values(by=['Trade Value'], ascending=False,ignore_index=True)
df['Trade Order'] = df.index + 1

print(df)
#        Code  Volume  Trade Value  Volume Order  Trade Order
# 0   Samsung     100         1500             4            1
# 1     Apple     500         1000             2            2
# 2  Facebook     250          750             3            3
# 3    Amazon    1000          500             1            4

【讨论】:

多么棒的答案。我做到了。最后,你能不能根据上面的例子生成代码Max Ordered Number和Final Sorted Number @Bianconera mozway 建议使用rank 而不是sort_values().index 更好。

以上是关于如何在 Python 中按多列对 Pandas DataFrame 进行排序的主要内容,如果未能解决你的问题,请参考以下文章