web-dev-qa-db-ja.com

Pandas GroupByのプロット結果

私はPandas=を学び始めており、特定のタスクを実行するための最もPythonic(またはpanda-thonic?)の方法を見つけようとしています。

列A、B、およびCを持つDataFrameがあるとします。

  • 列Aにはブール値が含まれます。各行のA値はtrueまたはfalseです。
  • 列Bには、プロットする重要な値がいくつかあります。

発見したいのは、Aがfalseに設定された行のB値と、Aがtrueの行のB値との微妙な違いです。

つまり、列Aの値(trueまたはfalse)でグループ化し、同じグラフに両方のグループの列Bの値をプロットするにはどうすればよいですか? 2つのデータセットの色を変える必要がありますポイントを区別できるようにします。


次に、このプログラムに別の機能を追加しましょう。グラフ化する前に、各行の別の値を計算して列Dに保存します。この値は、レコードの5分前にBに保存されたすべてのデータの平均です。 Aに保存されている同じブール値を持つ行のみを含めます。

つまり、A=Truetime=tの行がある場合、t-5からtまでのすべてのレコードのBの平均である列Dの値を計算したいA=True

この場合、Aの値でgroupbyを実行し、この計算を各グループに適用し、最後に2つのグループのD値をプロットするにはどうすればよいですか?

39
Maxim Zaslavsky

@herrfzがすべての高得点に達したと思います。詳細を具体化します。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

sin = np.sin
cos = np.cos
pi = np.pi
N = 100

x = np.linspace(0, pi, N)
a = sin(x)
b = cos(x)

df = pd.DataFrame({
    'A': [True]*N + [False]*N,
    'B': np.hstack((a,b))
    })

for key, grp in df.groupby(['A']):
    plt.plot(grp['B'], label=key)
    grp['D'] = pd.rolling_mean(grp['B'], window=5)    
    plt.plot(grp['D'], label='rolling ({k})'.format(k=key))
plt.legend(loc='best')    
plt.show()

enter image description here

43
unutbu