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

如何将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
...
解决方案

实现思路

  1. 提前将df2的列名转为numpy数组,利用numpy的向量运算快速找到最接近的列
  2. 遍历df1的每一行和每个元素,拆分出float值和int值
  3. 通过np.argmin定位最接近的列索引,获取对应列名
  4. 累加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:21:01