катится со строковыми переменными - PullRequest
0 голосов
/ 05 октября 2018

Рассмотрим этот пример

import pandas as pd
import numpy as np

df = pd.DataFrame({'mytime' : [pd.to_datetime('2018-01-01 14:34:12.340'),
                             pd.to_datetime('2018-01-01 14:34:13.0'),
                             pd.to_datetime('2018-01-01 14:34:15.342'),
                             pd.to_datetime('2018-01-01 14:34:16.42'),
                             pd.to_datetime('2018-01-01 14:34:28.742')],
                    'myvalue' : [1,2,np.NaN,3,1],
                    'mychart' : ['a','b','c','d','e']})

df.set_index('mytime', inplace = True)

df
Out[15]: 
                        mychart  myvalue
mytime                                  
2018-01-01 14:34:12.340       a      1.0
2018-01-01 14:34:13.000       b      2.0
2018-01-01 14:34:15.342       c      NaN
2018-01-01 14:34:16.420       d      3.0
2018-01-01 14:34:28.742       e      1.0

Здесь я хочу concatenate строки в mychart, используя значения за последние 2 секунды (не последние два наблюдения).

К сожалению, обе приведенные ниже попытки с треском проваливаются

df.mychart.rolling(window = '2s', closed = 'right').apply(lambda x: ' '.join(x), raw = False)
df.mychart.rolling(window = '2s', closed = 'right').apply(lambda x: (x + ' ').cumsum(), raw = False)

TypeError: cannot handle this type -> object

Мы наконец достигли пределов того, что может Pandas 23.4 сделать?:) Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Немного поразмыслив, и работайте только тогда, когда в результате скручивания есть два конкатата, вы можете работать немного больше и создать свою собственную функцию и включить все возможные числа и размеры прокрутки

df['newmap']=np.arange(len(df)) # vassign new column
d=dict(zip(df['newmap'].astype(str),df.mychart))# create dict for replace
df['rollingstring']=df.newmap.rolling(window = '2s', closed = 'right').sum().astype(int)

df['newmap']=df['newmap'].astype(str)

df['rollingstring']=df['rollingstring'].astype(str)
# this part can be replace with a function⬇⬇⬇⬇⬇
df.loc[df.rollingstring!=df.newmap,'rollingstring']=(df.rollingstring.astype(int).sub(1)/2).astype(int).astype(str)+','+(df.rollingstring.astype(int).add(1)/2).astype(int).astype(str)


df.rollingstring.replace(d,regex=True)
Out[355]: 
mytime
2018-01-01 14:34:12.340      a
2018-01-01 14:34:13.000      b
2018-01-01 14:34:15.342      c
2018-01-01 14:34:16.420    c,d
2018-01-01 14:34:28.742      e
Name: rollingstring, dtype: object
0 голосов
/ 05 октября 2018

Не похоже, что df.Rolling будет поддерживать это.Вместо этого, вы можете пересчитать интервалы в 1 секунду, а затем просто объединить каждое значение со строкой после него?

Затем вы можете объединить результат, используя merge_asof:

v = df.resample('1s').agg(''.join)
pd.merge_asof(df, 
              v.add(v.shift(-1)).rename({'mychart': 'res'}, axis=1), 
              left_index=True, 
              right_index=True)

                         myvalue mychart  res
mytime                                       
2018-01-01 14:34:12.340      1.0       a   ab
2018-01-01 14:34:13.000      2.0       b    b
2018-01-01 14:34:15.342      NaN       c   cd
2018-01-01 14:34:16.420      3.0       d    d
2018-01-01 14:34:28.742      1.0       e  NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...