猿问

熊猫 groupby() 的 KeyError 应用()

在这里,我将时间添加到仅给出日期的数据中。值之间有 5 分钟或每个日期 288 个值。

该代码在输入数据帧为 1 天(288 行)或更短时有效,但在输入较长时会出错。知道我错过了什么吗?提前致谢。


相关代码部分:


import datetime as dt

print("Print df_raw:\n", df_raw)


df = df_raw[:288]

# df = df_raw[:289]  # Gives KeyError, see traceback below

print("\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 x


df = 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   values

0   2015-03-10   556.25

0   2015-03-10  516.993

0   2015-03-10   468.75

0   2015-03-10  432.812

0   2015-03-10  87.1095

..         ...      ...

84  2014-12-16     None

84  2014-12-16     None

84  2014-12-16  160.938

84  2014-12-16  145.118

84  2014-12-16  125.977


[24480 rows x 2 columns]


Print df BEFORE groubpy/apply:

           date   values

0   2015-03-10   556.25

0   2015-03-10  516.993

0   2015-03-10   468.75

0   2015-03-10  432.812

0   2015-03-10  87.1095

..         ...      ...

0   2015-03-10  781.446

0   2015-03-10   743.36

0   2015-03-10  708.985

0   2015-03-10  669.922

0   2015-03-10  632.422


[288 rows x 2 columns]


Print df AFTER groubpy/apply:

                       values

DT                          

2015-03-10 00:00:00   556.25

2015-03-10 00:05:00  516.993

2015-03-10 00:10:00   468.75

2015-03-10 00:15:00  432.812

2015-03-10 00:20:00  87.1095

...                      ...

2015-03-10 23:35:00  781.446

2015-03-10 23:40:00   743.36

2015-03-10 23:45:00  708.985

2015-03-10 23:50:00  669.922

2015-03-10 23:55:00  632.422


[288 rows x 1 columns]


慕森卡
浏览 105回答 2
2回答

慕田峪4524236

当您将 apply 函数与 groupby 一起使用时,您无法访问函数内部的 group 键。相反,您可以逐组遍历分组的数据帧,并将处理后的数据帧附加在一起。import pandas as pdt = 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                  dt0 2015-03-10      1 2015-03-10 00:00:001 2015-03-10      2 2015-03-10 00:05:002 2015-03-10      3 2015-03-10 00:10:003 2015-03-10      4 2015-03-10 00:15:004 2015-03-11      5 2015-03-11 00:00:005 2015-03-11      6 2015-03-11 00:05:006 2015-03-11      7 2015-03-11 00:10:00

开满天机

你得到了,因为当你在 groupby 之后KeyError: 'date'使用它时,它没有被传递到函数中。apply()例如,您尝试将 lambda 添加到应用中。我不确定预期的行为,但它使功能正常工作。将其更改为:df = df.groupby('date').apply(lambda x: f(x))完整的工作示例:import datetime as dtdf = 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 xdf = df.groupby('date').apply(lambda x : f(x))df = df.set_index('DT').drop(columns='date')print(df)输出:            ADT           2018-09-09  12019-09-09  2
随时随地看视频慕课网APP

相关分类

Python
我要回答