2017-04-18 2 views
1

私は2つのデータフレームdf1とdf2を持っています。パンダは他のものをそのまま維持しながら特定の行の平均を取る

df1には日単位のデータが含まれており、date、id、value1、value2の4つのカラムがあります。

df2には、idに特定のイベントが発生した日付が含まれています。日付とIDの2つの列があります。

DF2がDF2に行ごとDF1

に日付とID列のサブセットであり、IはDF1で同じ日付とIDを持つ行を検索したい、と日付-1からローになるだろうそのidの現在の日付+ 1、前の3行を平均して置き換えます。

たとえば、df2からdate = 3およびid = Aを指定した場合、df1に日付が(2,3,4)、id = Aの行を検索したい場合は、これらの3行を結果の1行に置き換えます。

DF1:

index date id value1 value2 
    0 1 A 0.1  0.2 
    1 2 A 0.2  0.3 
    2 3 A 0.3  0.4 
    3 4 A 0.4  0.5 
    4 5 A 0.5  0.6 
    5 1 B 0.1  0.2 
    6 2 B 0.2  0.3 
    7 3 B 0.3  0.4 
    8 4 B 0.4  0.5 
    9 5 B 0.5  0.6 

DF2

index date id 
    0  3 A 
    1  3 B 

所望の出力

index date id value1 value2 
    0 1 A 0.1  0.2 
    1 3 A 0.3  0.4 
    2 5 A 0.5  0.6 
    3 1 B 0.1  0.2 
    4 3 B 0.3  0.4 
    5 5 B 0.5  0.6 
+0

あなたは自分自身で解決策を説明しています。「df1で日付が(2,3,4)、id = Aの行を探したい」...詳細の残りの部分と組み合わせて、あなたの試みはどんな感じですか?あなたは問題を分解しましたが、今どのようにコードに変換していますか?フィルタリングと 'pandas.Series.isin'の使用を考えてみましょう... – blacksite

答えて

2

注:

  • あなたが中心の窓と意味3期間のローリングを計算するように見えます。
  • そして計画、イベントのリストからのみ関連する行(df2)最後
  • ためにそれをスライスし、それらの値

と最初のデータフレーム(df1)を更新:

  • 使用パラメータwindow=3およびcenter=True 0123を持つpd.DataFrame.rollingを使用私は後で更新する必要があるので、インデックスに列['date', 'id']を配置します。
  • df2はインデックスとして機能する以外何もしていないので、私はそれがインデックスが明示的に
  • 最後に、私はlocreset_index

でデータフレームを更新しますするつもりです
d1 = df1.set_index(['date', 'id']) 
idx = pd.MultiIndex.from_arrays(df2.values.T) 

d1.loc[idx] = d1.groupby(level='id', group_keys=False).rolling(3, center=True).mean() 

d1.reset_index() 

    date id value1 value2 
0  1 A  0.1  0.2 
1  2 A  0.8  0.3 
2  3 A  0.5  0.5 
3  4 A  0.4  0.8 
4  5 A  0.5  0.6 
5  1 B  0.1  0.2 
6  2 B  0.2  0.3 
7  3 B  0.3  0.4 
8  4 B  0.4  0.5 
9  5 B  0.5  0.6 

セットアップ

# Note that changed the values of 
# the 2nd row of value1 and 
# the 4th row of value2 in order to 
# highlight that this works 
df1 = pd.DataFrame({ 
     'date': [1, 2, 3, 4, 5, 1, 2, 3, 4, 5], 
     'id': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'], 
     'value1': [0.1, 0.8, 0.3, 0.4, 0.5, 0.1, 0.2, 0.3, 0.4, 0.5], 
     'value2': [0.2, 0.3, 0.4, 0.8, 0.6, 0.2, 0.3, 0.4, 0.5, 0.6] 
    }) 

df2 = pd.DataFrame({'date': [3, 3], 'id': ['A', 'B']}) 
1
pd.concat([df1[(df1['id'] == row['id']) & df1['date'].isin([row['date'], row['date'] - 1, row['date'] + 1])] for _, row in df2.iterrows()]) 

これはもたらす:

 date id value1 value2 
index       
1   2 A  0.2  0.3 
2   3 A  0.3  0.4 
3   4 A  0.4  0.5 
6   2 B  0.2  0.3 
7   3 B  0.3  0.4 
8   4 B  0.4  0.5 
関連する問題