Python Pandas:如何根据参考列小数位数对目标列进行取整?
问题:根据bid_1/ask_1的小数位数格式化bid_2/ask_2列
我想用Python Pandas实现:根据bid_1和ask_1列的小数位数,分别对bid_2和ask_2列的数值取整——比如bid_1小数点后有4位,bid_2也保留4位小数,以此类推。
原始DataFrame
symbol bid_1 ask_1 bid_2 ask_2 1222 1INCHUSDT 0.7135 0.714 0.71300000 0.71400000 1092 AAVEUSDT 87.35 87.4 87.40000000 87.50000000 1875 ACHUSDT 0.01405 0.01407 0.01407000 0.01409000
预期结果
symbol bid_1 ask_1 bid_2 ask_2 1222 1INCHUSDT 0.7135 0.714 0.7130 0.714 1092 AAVEUSDT 87.35 87.4 87.40 87.5 1875 ACHUSDT 0.01405 0.01407 0.01407 0.01409
尝试过的无效代码
df['digit'] = (df['bid_1'].find('.')) df['bid_2'] = float(round(float(bid_2), df['digit']))
解决方案
代码实现
import pandas as pd # 构建示例DataFrame(已有数据可跳过此步) data = { 'symbol': ['1INCHUSDT', 'AAVEUSDT', 'ACHUSDT'], 'bid_1': ['0.7135', '87.35', '0.01405'], 'ask_1': ['0.714', '87.4', '0.01407'], 'bid_2': [0.71300000, 87.40000000, 0.01407000], 'ask_2': [0.71400000, 87.50000000, 0.01409000] } df = pd.DataFrame(data, index=[1222, 1092, 1875]) # 计算单个值的小数位数 def get_decimal_places(val): if '.' in str(val): return len(str(val).split('.')[1]) return 0 # 生成bid和ask对应的小数位数列 df['bid_decimals'] = df['bid_1'].apply(get_decimal_places) df['ask_decimals'] = df['ask_1'].apply(get_decimal_places) # 逐行格式化bid_2和ask_2 df['bid_2'] = df.apply(lambda row: f"{row['bid_2']:.{row['bid_decimals']}f}", axis=1) df['ask_2'] = df.apply(lambda row: f"{row['ask_2']:.{row['ask_decimals']}f}", axis=1) # 输出结果(保留目标列) print(df[['symbol', 'bid_1', 'ask_1', 'bid_2', 'ask_2']])
说明
- 小数位数计算:通过
get_decimal_places函数将bid_1/ask_1转为字符串,拆分小数点后的部分,统计长度得到需要保留的小数位数。 - 逐行格式化:用
apply(axis=1)逐行处理数据,使用Python的f-string格式化语法,按照对应列的小数位数格式化bid_2/ask_2,自动补全末尾的零。 - 类型说明:如果需要将
bid_2/ask_2保持数值类型,可在格式化后添加.astype(float),但float类型会自动省略末尾的零;若要保留显示格式,建议保持字符串类型。
内容的提问来源于stack exchange,提问作者One boy
相关产品推荐
相关产品推荐

