如何将df1中的值按df2数值列名归类并累加至对应列?
问题描述
我有两个pandas DataFrame:
- df1是采集到的数据,每个元素都是
(float, int)类型的元组,结构如下:
Index 0 1 2 ... 0 (float,int) (float,int) (float,int) (float,int) 1 (float,int) (float,int) (float,int) (float,int) ... (float,int) (float,int) (float,int) (float,int)
- df2是空DataFrame,通过以下代码创建:
df2 = pd.DataFrame(index=df1.index, columns=np.arange(min, max, step).tolist())
结构如下:
Index float0 float1 float2 ... 0 1 ...
我的需求是:遍历df1中的每个元素,取出元素里的float值,找到df2中列名最接近这个float值的列,然后把元素里的int值累加到df2对应行的该列中(如果已有值就相加)。
我已经写了部分代码,但核心逻辑还没实现:
for j in range(len(df1)): # 遍历每一行 for i in range(len(df1.columns)): # 遍历每一列 # 以下是无法实现的伪代码 y = df2中与df1[i][j][0]最接近的列名 df2[y][j] = df2[y][j] + df1[i][j][1]
示例
df1示例:
Index 0 1 2 ... 0 (.2,3) (.4,5) (.4,4) (.6,2) 1 (.5,2) (.8,8) (.8,5) (.2,9) ... (.4,3) (.2,7) (.3,4) (.7,1)
df2初始状态:
Index .24 .47 .79 ... 0 1 ...
填充后的df2应该是:
Index .24 .47 .79 ... 0 3 9 2 1 9 2 13 ...
解决方案
实现思路
- 提前将df2的列名转为numpy数组,利用numpy的向量运算快速找到最接近的列
- 遍历df1的每一行和每个元素,拆分出float值和int值
- 通过
np.argmin定位最接近的列索引,获取对应列名 - 累加int值到df2的对应位置(初始用0填充空值,避免运算报错)
完整代码
import pandas as pd import numpy as np # 示例数据(替换为你的实际数据) df1_data = [ [(0.2, 3), (0.4, 5), (0.4, 4), (0.6, 2)], [(0.5, 2), (0.8, 8), (0.8, 5), (0.2, 9)], [(0.4, 3), (0.2, 7), (0.3, 4), (0.7, 1)] ] df1 = pd.DataFrame(df1_data) # 创建df2(示例参数,替换为你的实际min/max/step) min_val, max_val, step = 0.24, 0.8, 0.23 df2_columns = np.arange(min_val, max_val, step).tolist() df2 = pd.DataFrame(index=df1.index, columns=df2_columns).fillna(0) # 转为numpy数组加速匹配 df2_cols_array = np.array(df2.columns) # 遍历处理每个元素 for row_idx in df1.index: for col_idx in df1.columns: float_val, int_val = df1.loc[row_idx, col_idx] # 找到最接近的列索引 closest_col_idx = np.argmin(np.abs(df2_cols_array - float_val)) closest_col = df2_cols_array[closest_col_idx] # 累加数值 df2.loc[row_idx, closest_col] += int_val print(df2)
代码说明
- 初始化df2时用
fillna(0),避免空值导致的累加报错 - 用numpy数组做向量运算找最接近值,比循环遍历列名效率高很多
- 使用
df.loc访问元素,符合pandas规范,避免链式赋值的潜在问题 - 运行后df2的结果完全符合示例预期
内容的提问来源于stack exchange,提问作者spikelucky
相关产品推荐
相关产品推荐

