使用pandas重采样时如何获取字符串变量的模式

2024-04-24 09:37:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试重新采样一个熊猫数据帧,时间戳索引为每小时发生一次。我感兴趣的是获取具有字符串值的列的最常用值。但是,时间序列重采样的内置函数不包括mode作为重采样的默认方法之一(因为它是“mean”和“count”)。
我试图定义我自己的函数并传递该函数,但没有起作用。我_也_尝试_过_使用_ ^{<_cd1_>} _函数_ , _但_它_不_起_作用_ , _因为_我_正在_处理_字符串_ 。_在

以下是我的数据外观:

                   station_arrived action     lat1     lon1
date_removed
2012-01-01 13:12:00     56             A     19.4171 -99.16561   
2012-01-01 13:12:00     56             A     19.4271 -99.16361 
2012-01-01 15:41:00     56             A     19.4171 -99.16561 
2012-01-02 08:41:00     56             C     19.4271 -99.16561 
2012-01-02 11:36:00     56             C     19.2171 -99.16561

这是我目前为止的代码:

^{pr2}$

我看到以下错误:

Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
  File "C:\Program Files\Anaconda\lib\site-packages\pandas\core\generic.py", line 2836, in resample
    return sampler.resample(self).__finalize__(self)
  File "C:\Program Files\Anaconda\lib\site-packages\pandas\tseries\resample.py", line 83, in resample
    rs = self._resample_timestamps()
  File "C:\Program Files\Anaconda\lib\site-packages\pandas\tseries\resample.py", line 277, in _resample_timestamps
    result = grouped.aggregate(self._agg_method)
  File "C:\Program Files\Anaconda\lib\site-packages\pandas\core\groupby.py", line 2404, in aggregate
    result[col] = colg.aggregate(agg_how)
  File "C:\Program Files\Anaconda\lib\site-packages\pandas\core\groupby.py", line 2076, in aggregate
    ret = self._aggregate_multiple_funcs(func_or_funcs)
  File "C:\Program Files\Anaconda\lib\site-packages\pandas\core\groupby.py", line 2125, in _aggregate_multiple_funcs
    results[name] = self.aggregate(func)
  File "C:\Program Files\Anaconda\lib\site-packages\pandas\core\groupby.py", line 2073, in aggregate
    return getattr(self, func_or_funcs)(*args, **kwargs)
  File "C:\Program Files\Anaconda\lib\site-packages\pandas\core\groupby.py", line 486, in __getattr__
    (type(self).__name__, attr))
AttributeError: 'SeriesGroupBy' object has no attribute 'A  '

Tags: inpycoreselfpandaslibpackagesline
1条回答
网友
1楼 · 发布于 2024-04-24 09:37:22

dict中的值必须是表示函数的字符串(例如'count'/'sum'/'max')或传递给每个组的函数。您传递的是结果(值)mode(travels2012['action'])。在

因此,您需要将此函数设为一个函数,应用于每个组:

In [11]: df.resample('H', how={'station_arrived':'count',
                               'action': lambda x: mode(df['action']),
                                'lat1':'count', 'lon1':'count'})
Out[11]:
                    action  station_arrived  lon1  lat1
date_removed
2012-01-01 13:00:00    [A]                2     2     2
2012-01-01 14:00:00    [A]                0     0     0
2012-01-01 15:00:00    [A]                1     1     1
2012-01-01 16:00:00    [A]                0     0     0
...

我不确定这是否是您想要的(因为它适用于整个专栏),也许您需要为每个组采用模式:

^{pr2}$

我更希望看到实际值(A)而不是列表中的实际值,NaN而不是[]。


我认为值得一提的是Series mode方法,它有一个警告,即总是返回一个序列(因为可能有一个平局),如果没有值出现多次,则为空。
您可以按如下方式环绕它(您也可以类似地包装模式函数):

def mode_(s):
    try:
        return s.mode()[0]
    except IndexError:
        return np.nan

In [22]: df.resample('H', how={'station_arrived':'count',
                               'action': mode_, 'lat1':'count', 'lon1':'count'})
Out[22]:
                    action  station_arrived  lon1  lat1
date_removed
2012-01-01 13:00:00      A                2     2     2
2012-01-01 14:00:00    NaN                0     0     0
2012-01-01 15:00:00    NaN                1     1     1
2012-01-01 16:00:00    NaN                0     0     0
...

相关问题 更多 >