2016-12-26 36 views
-2

嗨,大家好,我有一個5列數據框:python,將函數應用於由id和timestamp索引每個功能列上的數據幀

ID(integer) TIME(整數)|溼度|溫度|壓力

ID =室溫
TIME = unixtimestamp秒
溼度/溫度/壓力=傳感器值

我需要....

我想執行一個過濾器(signal.lfilter)溼度/溫度/由ID壓力...例如...

爲ID = 1
執行所lfilter在溼度值由TIME ASC有序
在由時間升序排序的溫度值
執行所lfilter在壓力值由TIME ASC

爲ID = 2
有序執行所lfilter在溼度值由TIME ASC有序
在由有序溫度值執行lfilter執行lfilter TIME ASC
在由TIME ASC

有序壓力值執行lfilter ...

爲ID = N
在由時間升序排列溼度值執行lfilter
執行所lfilter在溫度值由TIME ASC
下令在由時間ASC

我怎麼可以這樣快速有序的壓力值執行lfilter?今天我使用2 for循環:

for i in df.id.unique(): 
    for column in ['humidity','temperature','pressure']: 
     df[df.id=i][column] = ... lfilter ... 

但它太慢了,有什麼幫助嗎?

+1

您還沒有提供足夠的信息來解決問題。根據'lfilter'的不同,我們可能會做一些非常快速的矢量化。但是你忽略了告訴我們它是什麼。嘗試按照這裏列出的建議[MCVE](http://stackoverflow.com/help/mcve) – piRSquared

回答

1

這不是超級乾淨,但請嘗試以下操作。這是您使用signal.lfilter函數後的操作嗎?

編輯:哎呀,忘了時間要求。在下面的操作之前,只需運行df.sort_values(['ID', 'TIME'], ascending=True)即可。

import pandas as pd 
from scipy import signal 
import numpy as np 

np.random.seed(1618) 

df = pd.DataFrame({'ID': [1,1,1,2,2,2], 
        'humidity': np.random.random(6), 
        'temperature': np.random.random(6), 
        'pressure': np.random.random(6)}) 

# >>> df 
#  ID humidity pressure temperature 
# 0 1 0.605160 0.194984  0.450019 
# 1 1 0.301108 0.077726  0.691227 
# 2 1 0.197976 0.144978  0.155231 
# 3 2 0.733884 0.458959  0.785704 
# 4 2 0.457377 0.647681  0.092045 
# 5 2 0.021497 0.417326  0.551941 

tmp = df.groupby('ID').apply(lambda x: signal.lfilter(x['humidity'], x['pressure'], x['temperature'])) 
# this produces a vector for each ID. 
# we have to unstack the vectors and append them to the original df 

df['filtered'] = tmp.apply(lambda x: pd.Series(x)).stack().reset_index()[0] 

# >>> df 
# ID humidity pressure temperature filtered 
# 0 1 0.605160 0.194984  0.450019 1.396696 
# 1 1 0.301108 0.077726  0.691227 2.283506 
# 2 1 0.197976 0.144978  0.155231 0.057383 
# 3 2 0.733884 0.458959  0.785704 1.256354 
# 4 2 0.457377 0.647681  0.092045 -0.842783 
# 5 2 0.021497 0.417326  0.551941 1.058038 
相關問題