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。