You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于列值对Pandas DataFrame结果进行排序(以24h列为例)

问题

现有一段通过requests爬取CoinMarketCap新币页面数据、并用Pandas生成包含Name、Price、1h、24h等列的DataFrame的Python代码,当前输出未排序。需要将DataFrame按指定列(如24h列)进行降序排序,请问如何实现?

原代码

import requests
import pandas as pd

url = "https://coinmarketcap.com/new/"
page = requests.get(url,headers={'User-Agent': 'Mozilla/5.0'}, timeout=1)
pagedata = page.text
usecols = ["Name", "Price", "1h", "24h", "MarketCap", "Volume"]#, "Blockchain"]

df = pd.read_html(pagedata)[0] #Checking table
df[["Name", "Symbol"]] = df["Name"].str.split(r"\d+", expand=True)
df = df.rename(columns={"Fully Diluted Market Cap": "MarketCap"})[usecols]
dfAsString = df.to_string(index=False)

print(dfAsString)

当前未排序输出(截断)

Name            Price      1h      24h       MarketCap       Volume
0        DollarPepe         $0.02752  22.64%  336.25%              $3     $456,913
1       Billy Token      $0.00002822  41.69%   75.80%      $1,958,942   $6,999,241
2              JEFF          $0.1946   4.42%  226.18%     $19,458,328  $19,744,583
3            PUG AI   $0.00000001459  10.80%   15.84%      $1,459,428     $239,454
4         FART COIN    $0.0000004281   1.13%   42.13%     $42,806,075      $46,604
[30 rows x 6 columns] 

期望排序后输出(按24h降序,截断)

Name            Price      1h      24h       MarketCap       Volume
0        DollarPepe         $0.02752  22.64%  336.25%              $3     $456,913
2              JEFF          $0.1946   4.42%  226.18%     $19,458,328  $19,744,583
1       Billy Token      $0.00002822  41.69%   75.80%      $1,958,942   $6,999,241
4         FART COIN    $0.0000004281   1.13%   42.13%     $42,806,075      $46,604
3            PUG AI   $0.00000001459  10.80%   15.84%      $1,459,428     $239,454
[30 rows x 6 columns]

解决方案

要实现按24h列降序排序,核心是先将带百分比符号的字符串列转换为数值类型,再使用sort_values方法排序,具体步骤如下:

  1. 转换百分比列为数值:去除1h、24h列的%符号,转为浮点型,确保排序逻辑正确。
  2. 按指定列排序:调用df.sort_values()方法,指定排序列和降序规则。
  3. 重置索引(可选):排序后原索引会混乱,重置索引可让输出更整洁。

修改后的完整代码

import requests
import pandas as pd

url = "https://coinmarketcap.com/new/"
page = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'}, timeout=1)
pagedata = page.text
usecols = ["Name", "Price", "1h", "24h", "MarketCap", "Volume"]

df = pd.read_html(pagedata)[0]
df[["Name", "Symbol"]] = df["Name"].str.split(r"\d+", expand=True)
df = df.rename(columns={"Fully Diluted Market Cap": "MarketCap"})[usecols]

# 关键步骤:将百分比列转换为数值类型
df['1h'] = df['1h'].str.replace('%', '').astype(float)
df['24h'] = df['24h'].str.replace('%', '').astype(float)

# 按24h列降序排序,ascending=False表示降序
df_sorted = df.sort_values(by='24h', ascending=False)

# 可选:重置索引,消除排序后的混乱索引
df_sorted = df_sorted.reset_index(drop=True)

# 将数值转回带%的格式,保持与原输出一致的显示样式
df_sorted['1h'] = df_sorted['1h'].astype(str) + '%'
df_sorted['24h'] = df_sorted['24h'].astype(str) + '%'

dfAsString = df_sorted.to_string(index=False)
print(dfAsString)

关键代码说明

  • df['24h'].str.replace('%', '').astype(float):移除百分比符号并转为浮点型,这是正确排序的前提,字符串类型的百分比无法直接比较大小。
  • df.sort_values(by='24h', ascending=False):指定按24h列降序排序,若需升序排序,将ascending设为True即可。
  • reset_index(drop=True):重置索引,让输出的行号从0开始连续递增,避免排序后索引混乱的问题。
  • 最后将数值转回带%的字符串,是为了保持和原输出一致的显示格式,不影响数据的实际排序逻辑。

内容的提问来源于stack exchange,提问作者Drew Duazeh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 06:10:44