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

如何基于两个Pandas DataFrame按样本计算自然对数比值生成新DataFrame

问题描述

现有两个对应不同时间点的Pandas DataFrame,列名完全一致,每一列代表一种细菌,每一行的索引是带时间前缀的样本ID。示例数据如下:

df_time0 = pd.DataFrame({'Bacteria1': [0.1, 0.2, 0.3],'Bacteria2': [0.2, 0.3, 0.4],
                         'Bacteria3': [0.3, 0.4, 0.5],}, index=['T0subject001', 'T0subject010', 'T0subject200'])

df_time1 = pd.DataFrame({'Bacteria1': [0.15, 0.15, 0.4],'Bacteria2': [0.3, 0.35, 0.2],
                         'Bacteria3': [0.3, 0.45, 0.6],}, index=['T1subject001', 'T1subject010', 'T1subject200'])

需要生成一个新的DataFrame,其中每个值为time1对应样本的细菌值除以time0对应样本细菌值的自然对数,新DataFrame的索引要去掉时间前缀(比如subject001)。例如:
new_df.at["subject001", "Bacteria1"] = ln(df_time1.at["T1subject001", "Bacteria1"]/df_time0.at["T0subject001", "Bacteria1"])

解决方案

无需手动遍历DataFrame,利用Pandas的索引处理和向量运算就能高效实现:

import pandas as pd
import numpy as np

# 示例数据
df_time0 = pd.DataFrame({'Bacteria1': [0.1, 0.2, 0.3],'Bacteria2': [0.2, 0.3, 0.4],
                         'Bacteria3': [0.3, 0.4, 0.5],}, index=['T0subject001', 'T0subject010', 'T0subject200'])

df_time1 = pd.DataFrame({'Bacteria1': [0.15, 0.15, 0.4],'Bacteria2': [0.3, 0.35, 0.2],
                         'Bacteria3': [0.3, 0.45, 0.6],}, index=['T1subject001', 'T1subject010', 'T1subject200'])

# 去掉索引的时间前缀,统一为纯样本ID
df_time0.index = df_time0.index.str[2:]
df_time1.index = df_time1.index.str[2:]

# 直接计算对应位置的比值自然对数,Pandas会自动按索引和列名对齐数据
result_df = np.log(df_time1 / df_time0)

print(result_df)

代码说明

  • str[2:]:截取索引字符串从第3位开始的部分,直接去掉T0/T1前缀
  • np.log():计算自然对数,借助Pandas的自动对齐机制,确保每个样本的对应细菌值精准匹配计算
  • 这种向量运算方式比手动遍历效率高数倍,尤其适合大样本量的数据集

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 10:55:11