2016-12-09 33 views
0

したがって、SQL Serverからデータを取り出し、データフレームに入力しました。すべてのデータは離散形式であり、各ステップの複数の出力値(たとえば、1000,1412,134.5,657.1 at)を使用して、一方向(0.1,0.2、... 9.8,9.9,10.0)の0.1ステップで増加します。 0.1)、(14.5、948.1、343.8/5.5) - あなたが私が何を言おうとしているのを見てほしい。1つのPandas(Python)データフレームと別のデータフレームの値を比較する必要があります

私はこれらの個々のステップを以下のようにグループ化し、グループごとに平均と標準偏差を取っています。

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

これは0.1の各ステップについての平均と標準偏差を有する2つのデータフレーム(グループ及びグループ2)になります。これは、次を使用して、各ステップの上限値と下限値を作成するために、そして簡単です:

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

今、私は混乱だビットが来ます!元のデータフレームに戻って、電力値が計算された制限値を超えている行/インスタンスを削除する必要があります(0.1ステップごとに異なる上限値と下限値があることに注意してください)。

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()関数をgoogleしてください。 – Chuck

+1

'group'と' group2'を投稿する有用で関連性の高い情報を提供する必要があります。 – Chuck

答えて

1

はとても背グループ化されていない行にこれらの操作の結果を使用すると、グループ化されたデータに何らかの操作を実行したい、あなたの目標別の言い方をして、プロジェクトに:

は、ここでのサンプルデータの50行をですこれらの行をフィルタリングするために使用することができます。これを行う1つの方法は、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

これは素晴らしいです!どうもありがとうございます。 しかし、複雑さの要素を1つ追加するために、 'step'という一意の値がある場合、このメソッドはデータフレームのその行を完全に削除します(数学的に意味があります)。そのユニークな行を保持することは可能ですか? たとえば、 'step'の5.3の値(power = 177.5、index = 5)は1回だけ発生し、もちろん標準偏差が0になるため、電力値と正確に等しい上限と下限を作成します177.5の。私はこの点を分析目的のために残しておきたいと思います。なぜなら、それは 'ステップ'のユニークな価値だからです。ありがとうございました – PenguinProgrammer

+0

私の提案は、フィルタリングする前にフィルタから除外するデータを削除し、フィルタリングが完了した後に再度追加することです。 – ASGM

関連する問題