假设我有一个看起来像这样的Pandas数据框:
import pandas as pd
import numpy as np
df = pd.DataFrame({"time": [100,200,300,400,100,200,300,np.nan],
"correct": [1,1,0,1,1,0,0,0]})
印刷:
correct time
0 1 100.0
1 1 200.0
2 0 300.0
3 1 400.0
4 1 100.0
5 0 200.0
6 0 300.0
7 0 NaN
我想仅计算<{1}}等于time
的行行的correct
的平均值。因此,在上面的数据框架中,我想计算0
,400
和300
的平均值(这将给出NaN
)
我需要小心处理350
值,以及最后一行有NaN
但后面没有一行的文字边缘情况
什么是最有效的方式在Pandas中执行此操作而不必诉诸循环数据框(我当前的实现)?
答案 0 :(得分:5)
您可以使用shift()方法:
In [55]: df.loc[df.correct.shift() == 0, 'time'].mean()
Out[55]: 350.0
说明:
In [53]: df.correct.shift()
Out[53]:
0 NaN
1 1.0
2 1.0
3 0.0
4 1.0
5 1.0
6 0.0
7 0.0
Name: correct, dtype: float64
In [54]: df.loc[df.correct.shift() == 0, 'time']
Out[54]:
3 400.0
6 300.0
7 NaN
Name: time, dtype: float64