如何基于列值对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方法排序,具体步骤如下:
- 转换百分比列为数值:去除
1h、24h列的%符号,转为浮点型,确保排序逻辑正确。 - 按指定列排序:调用
df.sort_values()方法,指定排序列和降序规则。 - 重置索引(可选):排序后原索引会混乱,重置索引可让输出更整洁。
修改后的完整代码
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
相关产品推荐
相关产品推荐

