为了账号安全,请及时绑定邮箱和手机立即绑定

熊猫 groupby() 的 KeyError 应用()

熊猫 groupby() 的 KeyError 应用()

慕森卡 2022-07-26 10:25:32
在这里,我将时间添加到仅给出日期的数据中。值之间有 5 分钟或每个日期 288 个值。该代码在输入数据帧为 1 天(288 行)或更短时有效,但在输入较长时会出错。知道我错过了什么吗?提前致谢。相关代码部分:import datetime as dtprint("Print df_raw:\n", df_raw)df = df_raw[:288]# df = df_raw[:289]  # Gives KeyError, see traceback belowprint("\nPrint df BEFORE groubpy/apply:\n", df)df.loc[:,'date'] = pd.to_datetime(df.date)def f(x):     x['DT']=[val+dt.timedelta(minutes=(pos*5)) for val,pos in zip(x.loc[:,'date'], range(0,len(x.loc[:,'date'])))]    return xdf = df.groupby('date').apply(f)df = df.set_index('DT').drop(columns='date')print("\nPrint df AFTER groubpy/apply:\n", df)输出(288 行或更少,按预期工作):Print df_raw:           date   values0   2015-03-10   556.250   2015-03-10  516.9930   2015-03-10   468.750   2015-03-10  432.8120   2015-03-10  87.1095..         ...      ...84  2014-12-16     None84  2014-12-16     None84  2014-12-16  160.93884  2014-12-16  145.11884  2014-12-16  125.977[24480 rows x 2 columns]Print df BEFORE groubpy/apply:           date   values0   2015-03-10   556.250   2015-03-10  516.9930   2015-03-10   468.750   2015-03-10  432.8120   2015-03-10  87.1095..         ...      ...0   2015-03-10  781.4460   2015-03-10   743.360   2015-03-10  708.9850   2015-03-10  669.9220   2015-03-10  632.422[288 rows x 2 columns]Print df AFTER groubpy/apply:                       valuesDT                          2015-03-10 00:00:00   556.252015-03-10 00:05:00  516.9932015-03-10 00:10:00   468.752015-03-10 00:15:00  432.8122015-03-10 00:20:00  87.1095...                      ...2015-03-10 23:35:00  781.4462015-03-10 23:40:00   743.362015-03-10 23:45:00  708.9852015-03-10 23:50:00  669.9222015-03-10 23:55:00  632.422[288 rows x 1 columns]
查看完整描述

2 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

当您将 apply 函数与 groupby 一起使用时,您无法访问函数内部的 group 键。


相反,您可以逐组遍历分组的数据帧,并将处理后的数据帧附加在一起。


import pandas as pd


t = pd.DataFrame({'date':['2015-03-10','2015-03-10','2015-03-10','2015-03-10','2015-03-11','2015-03-11','2015-03-11'],'value':[1,2,3,4,5,6,7]})


t['date'] = pd.to_datetime(t['date'])

创建一个新的数据框并将已处理的组附加到它。


em = pd.DataFrame()


for key,df in t.groupby('date'):

    temp = df

    temp['dt'] = [i+datetime.timedelta(minutes=j*5) for i,j in zip(df['date'],range(df['date'].shape[0]))]

    em = pd.concat([em,temp])

输出:


        date  value                  dt

0 2015-03-10      1 2015-03-10 00:00:00

1 2015-03-10      2 2015-03-10 00:05:00

2 2015-03-10      3 2015-03-10 00:10:00

3 2015-03-10      4 2015-03-10 00:15:00

4 2015-03-11      5 2015-03-11 00:00:00

5 2015-03-11      6 2015-03-11 00:05:00

6 2015-03-11      7 2015-03-11 00:10:00


查看完整回答
反对 回复 2022-07-26
?
开满天机

TA贡献1786条经验 获得超13个赞

你得到了,因为当你在 groupby 之后KeyError: 'date'使用它时,它没有被传递到函数中。apply()例如,您尝试将 lambda 添加到应用中。我不确定预期的行为,但它使功能正常工作。将其更改为:


df = df.groupby('date').apply(lambda x: f(x))

完整的工作示例:


import datetime as dt

df = pd.DataFrame({'A':[1,2],'date':['2018-09-09','2019-09-09']})

df.loc[:,'date'] = pd.to_datetime(df['date'])

def f(x): 

    x['DT']=[val+dt.timedelta(minutes=(pos*5)) for val,pos in zip(x.loc[:,'date'], range(0,len(x.loc[:,'date'])))]

    return x


df = df.groupby('date').apply(lambda x : f(x))

df = df.set_index('DT').drop(columns='date')

print(df)

输出:


            A

DT           

2018-09-09  1

2019-09-09  2


查看完整回答
反对 回复 2022-07-26
  • 2 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号