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

Python数据处理求助:按时间范围求和及数值分箱统计

Python数据集处理问题解决方案

1. 代码报错修复

你的代码报错为NameError: name 'df' is not defined,原因是lambda表达式里误用了未定义的变量df,需替换为实际的DataFrame名称BM。同时要复制原数据避免修改原始数据集,修正后的代码如下:

import pandas as pd

# 先确保交易日期为datetime格式(必须步骤)
BM['transaction_date'] = pd.to_datetime(BM['transaction_date'])

EndDate = BM['transaction_date'] + pd.to_timedelta(20, unit='D') 
StartDate = BM['transaction_date']

# 复制原数据,避免修改原始数据集
dfx = BM.copy()  
dfx['EndDate'] = EndDate
dfx['StartDate'] = StartDate

# 修正变量名错误,将df改为BM
dfx['20day_debit_sum'] = dfx.apply(lambda x: BM.loc[
    (BM['transaction_date'] >= x['StartDate']) & 
    (BM['transaction_date'] <= x['EndDate']), 
    'Debit'
].sum(), axis=1)

如果数据集较大,上述apply方法效率极低,推荐使用更高效的交叉连接分组求和方案:

import pandas as pd

BM['transaction_date'] = pd.to_datetime(BM['transaction_date'])
# 添加索引用于后续分组匹配
BM['idx'] = BM.index

# 生成所有基准日期与交易日期的组合
cross_df = pd.merge(
    BM[['idx', 'transaction_date']].rename(columns={'transaction_date': 'base_date'}),
    BM[['transaction_date', 'Debit']],
    how='cross'
)

# 筛选基准日期后20天内的交易记录
cross_df = cross_df[
    (cross_df['transaction_date'] >= cross_df['base_date']) &
    (cross_df['transaction_date'] <= cross_df['base_date'] + pd.to_timedelta(20, 'D'))
]

# 按基准索引分组计算20天内Debit总和
debit_sum = cross_df.groupby('idx')['Debit'].sum().reset_index(name='20day_debit_sum')

# 合并回原数据
BM = BM.merge(debit_sum, on='idx').drop('idx', axis=1)

2. 数值区间划分与次数统计

根据需求定义区间,对Debit和Credit进行分组,并统计各区间出现次数:

# 定义区间边界与标签(排除4001-4999、8001-8999的数值)
bins = [1999, 4000, 4999, 8000, 8999, 20000]
interval_labels = ['2000-4000', '5000-8000', '9000-20000']

# 为Debit划分区间
BM['debit_interval'] = pd.cut(
    BM['Debit'],
    bins=bins,
    labels=interval_labels,
    include_lowest=True  # 包含左边界2000
)

# 为Credit划分区间
BM['credit_interval'] = pd.cut(
    BM['Credit'],
    bins=bins,
    labels=interval_labels,
    include_lowest=True
)

# 统计Debit各区间出现次数
debit_interval_counts = BM['debit_interval'].value_counts().reset_index(name='count')
# 统计Credit各区间出现次数
credit_interval_counts = BM['credit_interval'].value_counts().reset_index(name='count')

3. 结果整合

你可以将20天Debit总和、区间划分结果合并到原数据集中,或单独提取统计结果,匹配预期输出格式。


内容的提问来源于stack exchange,提问作者mp.kaur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:18:43