如何在 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 进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 5.1 中按多列对 Illuminate Collection 进行排序?

如何在 Pandas 数据框中按行值对日期时间列进行排序?

如何在 MySQL Select 语句中按多列分组

pandas df中多列的唯一记录计数

Python Pandas 对多列进行值计数并根据结果生成图表

pandas 如何使用 groupby 在标签中按日期对列进行分组?