pandas中apply问题记录

文章讲述了在Pandas中,当对groupby分组后的DataFrame应用apply函数时,由于索引重置可能导致所有行的apply结果都变为第一行的结果。解决方法是在apply之前确保数据集索引的唯一性,如先进行reset_index()操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

apply函数相信大家都不陌生,我也使用过很多次,但这次突然就出现了问题,

对每一行都进行apply,但是所有行apply的结果都是第一行apply出的结果

让我们往下看。

下面是一个正常的例子

import pandas as pd 
from datetime import datetime 

data = pd.DataFrame({'start': ['07:50', '08:10'], 'end': ['08:15', '08:30']})
data['start'], data['end'] = pd.to_datetime(data['start'], format='%H:%M'), pd.to_datetime(data['end'], format='%H:%M')

def test_apply(start, end):
    """测试apply函数 根据start和end生成每5分钟间隔的时间序列"""
    time_series = pd.date_range(start=start, end=end, freq='5T')
    time_result = [datetime.strftime(x, '%H:%M') for x in time_series]
    return time_result
data['time_series'] = data.apply(lambda x: test_apply(x['start'], x['end']), axis=1)
data

输出结果如下,

可以看出,每一行都以start作为起始时间、end作为结束时间,生成了每隔5分钟的时间序列,结果正确。

接下来我们看错误例子,

出错前提为,对某一个数据集groupby分组处理(包含了索引重置)合并之后运行了生成时间序列的函数,示例代码如下,

import pandas as pd
from datetime import datetime 

data = pd.DataFrame({'flag': [1, 2], 'start': ['07:50', '08:10'], 'end': ['08:15', '08:30']})

df = pd.DataFrame()
for *k, group in data.groupby('flag'):
    # 这里重置索引之后 ,每个分组的索引都是0 就导致了下面apply函数的结果异常
    group.reset_index(drop=True, inplace=True)
    df = pd.concat([df, group])

def test_apply(start, end):
    """测试apply函数 根据start和end生成每5分钟间隔的时间序列"""
    time_series = pd.date_range(start=start, end=end, freq='5T')
    time_result = [datetime.strftime(x, '%H:%M') for x in time_series]
    return time_result

df['time_series'] = df.apply(lambda x: test_apply(x['start'], x['end']), axis=1).reset_index(drop=True)
df

这里对每个分组都进行了reset_index()操作,使得每个分组的索引都相同(都是0)

输出结果如下,

可以看出,time_series的值都是按照第一行(索引为0)的start和end生成的。

所以进行apply前,应该要确保数据集索引的唯一性,可以先reset_index()再apply。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

煮雨小筑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值