2016-12-09 55 views
0

因此,我從一個sql server中提取數據,並將其輸入到數據框中。所有的數據都是離散形式,並且在一個方向上以0.1步增加(0.0,0.1,0.2 ... 9.8,9.9,10.0),每個步的多個功率值(例如1000,1412,134.5,657.1 0.1),(14.5,948.1,343.8 at 5.5) - 希望你能看到我想說的話。需要比較一個熊貓(Python)數據幀與另一個數據幀的值

我已經設法將數據分組到這些單獨的步驟,使用以下,然後採取每組的平均值和標準差。

group = df.groupby('step').power.mean() group2 = df.groupby('step').power.std().fillna(0)

這導致在具有用於每個0.1步驟的平均值和標準偏差兩個數據幀(組和第2組)。它當時很容易使用,以創建每一步的上限和下限如下:

upperlimit = group + 3*group2 lowerlimit = group - 3*group2 lowerlimit[lowerlimit<0] = 0

現在來我感到困惑的一點!我需要回到原始數據框中,並移除功率值超出這些計算極限的行/實例(注意每個0.1步有不同的上限和下限)。

下面是50條線的樣本數據:

Index Power    Step 
0  106.0    5.0 
1  200.4    5.5 
2  201.4    5.6 
3  226.9    5.6 
4  206.8    5.6 
5  177.5    5.3 
6  124.0    4.9 
7  121.0    4.8 
8   93.9    4.7 
9  135.6    5.0 
10  211.1    5.6 
11  265.2    6.0 
12  281.4    6.2 
13  417.9    6.9 
14  546.0    7.4 
15  619.9    7.9 
16  404.4    7.1 
17  241.4    5.8 
18  44.3    3.9 
19  72.1    4.6 
20  21.1    3.3 
21   6.3    2.3 
22   0.0    0.8 
23   0.0    0.9 
24   0.0    3.2 
25   0.0    4.6 
26  33.3    4.2 
27  97.7    4.7 
28  91.0    4.7 
29  105.6    4.8 
30  97.4    4.6 
31  126.7    5.0 
32  134.3    5.0 
33  133.4    5.1 
34  301.8    6.3 
35  298.5    6.3 
36  312.1    6.5 
37  505.3    7.5 
38  491.8    7.3 
39  404.6    6.8 
40  324.3    6.6 
41  347.2    6.7 
42  365.3    6.8 
43  279.7    6.3 
44  351.4    6.8 
45  350.1    6.7 
46  573.5    7.9 
47  490.1    7.5 
48  520.4    7.6 
49  548.2    7.9 
+0

安置自己的數據和樣品。另外谷歌Pandas.DataFrame.Lookup()函數。 – Chuck

+1

發佈'group'和'group2'您需要儘可能多地提供有用和相關的信息。 – Chuck

回答

1

把你的目標的另一種方式,要在對分組數據執行一些操作,然後投射這些操作的結果返回到未分組行,以便您可以使用它們來過濾這些行。一種方法是使用transform

transform方法返回的索引與被分組的索引相同(相同大小)的對象。因此,傳遞的轉換函數應返回與組塊大小相同的結果。

可以然後直接創建新行:

df['upper'] = df.groupby('step').power.transform(lambda p: p.mean() + 3*p.std().fillna(0)) 
df['lower'] = df.groupby('step').power.transform(lambda p: p.mean() - 3*p.std().fillna(0)) 
df.loc[df['lower'] < 0, 'lower'] = 0 

和排序相應:你的數據幀的

df = df[(df.power <= df.upper) & (df.power >= df.lower())] 
+0

這太棒了!非常感謝。 但是,爲了增加一點複雜性 - 當存在唯一的「step」值時,此方法完全刪除數據幀的該行(數學上有意義)。是否有可能保持這一獨特的行? 例如,'step'中的5.3值(power = 177.5,index = 5)只出現一次,當然會使標準偏差爲零,因此創建的上下限等於功率值爲177.5。然而,爲了分析的目的,我想保留這一點,因爲它是'step'的獨特價值。謝謝 – PenguinProgrammer

+0

我的建議是在過濾之前刪除要從過濾器中排除的數據,然後在過濾完成後再將其添加回來。 – ASGM

相關問題