编程语言
首页 > 编程语言> > python-在重采样的how =中插入新的不存在的列

python-在重采样的how =中插入新的不存在的列

作者:互联网

我在读resample a dataframe with different functions applied to each column?

解决方案是:

frame.resample('1H', how={'radiation': np.sum, 'tamb': np.mean})

假设我要向存储某些其他函数值的结果中添加不存在的列,例如count().在给出的示例中,说出是否要计算每个1H周期中的行数.

是否可以这样做:

frame.resample('1H', how={'radiation': np.sum, 'tamb': np.mean,\
               'new_column': count()})

注意,new_column不是原始数据帧中的现有列.

我问的原因是我需要这样做,并且我有一个非常大的数据框,我不想对原始df进行两次重采样,只是为了获得重采样期间的计数.

我现在正在尝试上述操作,这似乎要花很长时间(没有语法错误).不知道python是否陷入某种永久循环.

更新:

我实现了使用agg的建议(谢谢您).

但是,在计算第一个聚合器时收到以下错误:

grouped = df.groupby(['name1',pd.TimeGrouper('M')])
    return pd.DataFrame(
    {'new_col1': grouped['col1'][grouped['col1'] > 0].agg('sum')
    ...


/Users/blahblah/anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in __getitem__(self, key)
    521 
    522     def __getitem__(self, key):
--> 523         raise NotImplementedError('Not implemented: %s' % key)
    524 
    525     def _make_wrapper(self, name):

NotImplementedError: Not implemented: True

当我使用grouped.apply(foo)时,以下工作.

new_col1 = grp['col1'][grp['col1'] > 0].sum()

解决方法:

重采样类似于使用TimeGrouper进行分组.重采样时
参数如何只允许您为每一列指定一个聚合器,
df.groupby(…)返回的GroupBy对象具有agg方法,可以将其传递给各种函数(例如均值,总和或计数)以各种方式聚合组.您可以使用以下结果来构建所需的DataFrame:

import datetime as DT
import numpy as np
import pandas as pd
np.random.seed(2016)

date_times = pd.date_range(DT.datetime(2012, 4, 5, 8, 0),
                           DT.datetime(2012, 4, 5, 12, 0),
                           freq='1min')
tamb = np.random.sample(date_times.size) * 10.0
radiation = np.random.sample(date_times.size) * 10.0
df = pd.DataFrame(data={'tamb': tamb, 'radiation': radiation},
                  index=date_times)

resampled = df.resample('1H', how={'radiation': np.sum, 'tamb': np.mean})
print(resampled[['radiation', 'tamb']])
#                       radiation      tamb
# 2012-04-05 08:00:00  279.432788  4.549235
# 2012-04-05 09:00:00  310.032188  4.414302
# 2012-04-05 10:00:00  257.504226  5.056613
# 2012-04-05 11:00:00  299.594032  4.652067
# 2012-04-05 12:00:00    8.109946  7.795668

def using_agg(df):
    grouped = df.groupby(pd.TimeGrouper('1H'))
    return pd.DataFrame(
        {'radiation': grouped['radiation'].agg('sum'), 
         'tamb': grouped['tamb'].agg('mean'), 
         'new_column': grouped['tamb'].agg('count')})

print(using_agg(df))

产量

                     new_column   radiation      tamb
2012-04-05 08:00:00          60  279.432788  4.549235
2012-04-05 09:00:00          60  310.032188  4.414302
2012-04-05 10:00:00          60  257.504226  5.056613
2012-04-05 11:00:00          60  299.594032  4.652067
2012-04-05 12:00:00           1    8.109946  7.795668

请注意我建议使用groupby / apply的第一个答案:

def using_apply(df):
    grouped = df.groupby(pd.TimeGrouper('1H'))
    result = grouped.apply(foo).unstack(-1)
    result = result.sortlevel(axis=1)
    return result[['radiation', 'tamb', 'new_column']]

def foo(grp):
    radiation = grp['radiation'].sum()
    tamb = grp['tamb'].mean()
    cnt = grp['tamb'].count()
    return pd.Series([radiation, tamb, cnt], index=['radiation', 'tamb', 'new_column'])

事实证明,在此处使用Apply比使用agg慢得多.如果我们在1681行DataFrame上对using_agg与using_apply进行基准测试:

np.random.seed(2016)

date_times = pd.date_range(DT.datetime(2012, 4, 5, 8, 0),
                           DT.datetime(2012, 4, 6, 12, 0),
                           freq='1min')
tamb = np.random.sample(date_times.size) * 10.0
radiation = np.random.sample(date_times.size) * 10.0
df = pd.DataFrame(data={'tamb': tamb, 'radiation': radiation},
                  index=date_times)

我发现使用IPython的%timeit函数

In [83]: %timeit using_apply(df)
100 loops, best of 3: 16.9 ms per loop

In [84]: %timeit using_agg(df)
1000 loops, best of 3: 1.62 ms per loop

using_agg明显比using_apply和(基于
%timeit测试),随着len(df),有利于using_agg的速度优势越来越大
成长.

顺便说一下

frame.resample('1H', how={'radiation': np.sum, 'tamb': np.mean,\
               'new_column': count()})

除了如何dict不接受不存在的列名的问题外,count中的括号也是有问题的. how dict中的值应该是函数对象. count是一个函数对象,而count()是通过调用count返回的值.

由于Python在调用函数之前先评估参数,因此count()在frame.resample(…)之前被调用,然后count()的返回值与绑定到how参数的字典中的键“ new_column”关联.那不是你想要的.

关于更新的问题:在调用groupby / agg之前预先计算所需的值:

代替

grouped = df.groupby(['name1',pd.TimeGrouper('M')])
return pd.DataFrame(
    {'new_col1': grouped['col1'][grouped['col1'] > 0].agg('sum')
     ...
# ImplementationError since `grouped['col1']` does not implement __getitem__

采用

df['col1_pos'] = df['col1'].clip(lower=0)
grouped = df.groupby(['name1',pd.TimeGrouper('M')])
return pd.DataFrame(
    {'new_col1': grouped['col1_pos'].agg('sum')
    ...

有关预计算为何有助于性能的更多信息,请参见bottom of this post.

标签:pandas,resampling,python
来源: https://codeday.me/bug/20191118/2031516.html