2014-06-19 138 views
3

值選擇行我有一個DataFrame用連續測量,由偶然事件標記:圍繞大熊貓

TimeIndex Event Value 
0   NaN  4.099969 
1   NaN  3.833528 
2   NaN  -1.335025 
3   A  4.420085 
4   NaN  4.508899 
5   NaN  4.557383 
6   B  -3.377152 
7   NaN  4.508899 
8   NaN  -1.919803 
9   A  2.18520 
10   NaN  3.821221 
11   C  0.922389 
12   NaN  2.165784 

我想平均每個事件,也是平均兩個時間點之前和兩個時間事件發生後的點數。像這樣的東西可能會奏效:

TimeIndex Event Value  Around_A Around_B Around_C 
0   NaN  4.099969  NaN  NaN  NaN 
1   NaN  3.833528  -2  NaN  NaN 
2   NaN  -1.335025  -1  NaN  NaN 
3   A  4.420085  0  NaN  NaN 
4   NaN  4.508899  1  -2  NaN 
5   NaN  4.557383  2  -1  NaN 
6   B  -3.377152  NaN  0  NaN 
7   NaN  4.508899  -2   1  NaN 
8   NaN  -1.919803  -1   2  NaN 
9   A  2.18520  0  NaN  2 
10   NaN  3.821221  1  NaN  -1 
11   C  0.922389  2  NaN  0 
12   NaN  2.165784  NaN  NaN  1 

但是:1)我不知道該如何獲得新的列值,而循環和2)追加一個新列了許多不同的事件變得棘手的(我有)

是否有更簡單的方法來選擇圍繞熊貓值的時間點/行,然後按時間點/行平均?

我期望的輸出是事件X AroundTime平均值(如圖所示虛擬手段)

Event AroundTime Value.mean 
A   -2  3.35 
A   -1  0.19 
A   0  2.33 
A   1  -1.01 
A   2  3.78 
B   -2  4.53 
B   -1  4.22 
B   0  5.14 
B   1  1.88 
B   2  0.70 
C   -2  -1.01 
C   -1  -2.33 
C   0  1.69 
C   1  1.19 
C   2  2.21 
+0

額外的澄清是非常有幫助的。請參閱編輯。 –

回答

3

我會建議:

In [26]: 

print df 
    TimeIndex Event  Value 
0   0 NaN 4.099969 
1   1 NaN 3.833528 
2   2 NaN -1.335025 
3   3  A 4.420085 
4   4 NaN 4.508899 
5   5 NaN 4.557383 
6   6  B -3.377152 
7   7 NaN 4.508899 
8   8 NaN -1.919803 
9   9  A 2.185200 
10   10 NaN 3.821221 
11   11  C 0.922389 
12   12 NaN 2.165784 

[13 rows x 3 columns] 
In [27]: 

df['Around_A']=np.nan 
In [28]: 

for i in range(-2,3): 
    df['Around_A'][(df.Event=='A').shift(i).fillna(False)]=i 
    #or df.ix[(df.Event=='A').shift(i).fillna(False), 'Around_A']=i 
In [29]: 

print df 
    TimeIndex Event  Value Around_A 
0   0 NaN 4.099969  NaN 
1   1 NaN 3.833528  -2 
2   2 NaN -1.335025  -1 
3   3  A 4.420085   0 
4   4 NaN 4.508899   1 
5   5 NaN 4.557383   2 
6   6  B -3.377152  NaN 
7   7 NaN 4.508899  -2 
8   8 NaN -1.919803  -1 
9   9  A 2.185200   0 
10   10 NaN 3.821221   1 
11   11  C 0.922389   2 
12   12 NaN 2.165784  NaN 

[13 rows x 4 columns] 

不要完全得到你的最後一個問題,提供心靈預期的結果?

編輯

現在很清楚,我的做法:

In [22]: 

df=pd.read_clipboard() 
df['Around_A']=np.nan 
df['Around_B']=np.nan 
df['Around_C']=np.nan 
for i in range(-2,3): 
    df.ix[(df.Event=='A').shift(i).fillna(False), 'Around_A']=i 
    df.ix[(df.Event=='B').shift(i).fillna(False), 'Around_B']=i 
    df.ix[(df.Event=='C').shift(i).fillna(False), 'Around_C']=i 
Data=[] 
for s in ['A', 'B', 'C']: 
    _df=pd.DataFrame(df.groupby('Around_%s'%s).Value.mean()) 
    _df['Event']=s 
    _df.index.name='AroundTime' 
    Data.append(_df.reset_index()) 
print pd.concat(Data)[['Event', 'AroundTime', 'Value']] 
    Event AroundTime  Value 
0  A   -2 4.171213 
1  A   -1 -1.627414 
2  A   0 3.302643 
3  A   1 4.165060 
4  A   2 2.739886 
0  B   -2 4.508899 
1  B   -1 4.557383 
2  B   0 -3.377152 
3  B   1 4.508899 
4  B   2 -1.919803 
0  C   -2 2.185200 
1  C   -1 3.821221 
2  C   0 0.922389 
3  C   1 2.165780 

[14 rows x 3 columns] 
+0

不幸的是,我在'for範圍(-2,3)'循環中出現'MemoryError'。我有16種事件類型和2800880個時間點,這就是爲什麼我希望有一種方法可以通過將公式/條件應用於整個向量來獲得此方法。 – Amyunimus

+0

我認爲在這種情況下使用'apply'將會很困難,因爲它是有條件的(基於周圍的單元格)。我想你們很多人想爲'Around_A,B ....'生成單獨的'DataFrame'。一旦你得到了這些,你可以使用'dropna()'去除包含'nan's的行,這將使數據集更小,並且可以完全避免內存問題。 –