2017-04-18 59 views
1

我有兩個數據幀:df1和df2。大熊貓在保持其他行不變的同時取平均值

df1包含日常數據,並有4列:日期,ID,值1,值2;

df2包含某個事件發生在某個ID上的日期;它有兩列:日期和ID。

DF2是DF1

日期和編號列在DF2每一行的一個子集,我想找到與DF1相同的日期和編號行,並從日期-1獲得的行到該日期+ 1爲止,取平均值並替換前三行。

例如,如果我有df2中的date = 3和id = A,我想在df1中查找(2,3,4)中的日期和id = A的行,取這些行的平均值和將這三行替換爲最後一行。

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

你有點自己拼寫出解決方案:「我想查找行中(2,3,4)中的日期和df1中的id = A」......結合剩下的細節,你的嘗試看起來像?你已經解決了這個問題,現在你怎麼把它翻譯成代碼?想想過濾和使用'pandas.Series.isin' ... – blacksite

回答

2

注:

  • 看起來你要計算與中心窗口3期滾動平均值。
  • 然後切它僅從事件(df2
  • 最後,更新第一數據框(df1)與值列表中的相關行

安排:

  • 使用pd.DataFrame.rolling並帶參數window=3center=True
  • ,因爲我需要稍後更新,因此我要將索引中的列['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