如何使用for循环批量替换DataFrame中带单位的列数据?
批量转换TikTok统计数据中的带单位数值
问题背景
手里有一份TikTok统计数据的DataFrame,包含以下列:
- Views avg.
- Likes avg
- Comments avg.
- Shares avg
部分列的数值带有M(百万)、K(千)单位,数据示例如下:
| Views avg. | Likes avg | Comments avg. | Shares avg |
|---|---|---|---|
| 3 | 18.7M | 2.6M | 54.7K |
| 6 | 17.7M | 2.3M | 18K |
之前尝试了两种转换方法,但在遍历DataFrame列时遇到瓶颈(对应代码for views in df_tiktok: #THIS IS WHERE I GET STUCK),需要实现用正则表达式结合循环的方式,把指定列的带单位数值批量转为纯数值。
此前尝试的代码
首次尝试
likes_avg = [[likes] for likes in tiktok_data] if 'K' in likes : like=likes.strip('K') like=float(like)*1000 likes_avg.append(round(like)) if 'M' in likes : like=likes.strip('M') like=float(like)*1000000 likes_avg.append(round(like))
第二次尝试
input = '18.7m, 17.7m, 11.1m, 9.3m, 6.9m, 9.9m, 4.4m, 1.8m, 7.9m' multipliers = {'k': 1e3, 'm': 1e6, } pattern = r'([0-9.]+)([km])' for number, suffix in re.findall(pattern, input): number = float(number) print(number * multipliers[suffix])
解决方法
步骤1:编写通用转换函数
先写一个能处理单个带单位字符串的函数,用正则匹配数值和单位:
import re import pandas as pd def convert_unit(value): # 处理空值或纯数字的情况 if pd.isna(value) or str(value).isdigit(): return float(value) multipliers = {'k': 1e3, 'm': 1e6} # 匹配不区分大小写的单位 pattern = r'([0-9.]+)([KMkm])' match = re.match(pattern, str(value)) if match: num = float(match.group(1)) suffix = match.group(2).lower() return num * multipliers[suffix] # 匹配失败时返回原数值(可按需调整逻辑) return value
步骤2:遍历指定列批量转换
明确需要处理的列,用for循环遍历这些列,对每一列应用转换函数:
# 假设你的DataFrame名为df_tiktok cols_to_convert = ['Likes avg', 'Comments avg.', 'Shares avg'] # Views avg.为纯数字,可跳过 for col in cols_to_convert: df_tiktok[col] = df_tiktok[col].apply(convert_unit)
说明
- 函数兼容了纯数字、空值场景,避免转换时报错
- 正则不区分大小写,
K/k、M/m都能匹配识别 - 直接遍历需要转换的列名列表,比遍历整个DataFrame更高效精准
内容的提问来源于stack exchange,提问作者Sindy Saintclair
相关产品推荐
相关产品推荐

