如何在 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 |
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 |
3 | 3 | |
Amazon | 1 | 4 |
最终输出
Code | Max Ordered Number | Final Sorted Number |
---|---|---|
Samsung | 4 | 1 |
Amazon | 4 | 2 |
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_df
和trade_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 进行排序?