【发布时间】:2017-07-09 03:58:21
【问题描述】:
我正在尝试通过检查 X 列的前 9 行和当前行值来计算每行的新 Y 列。基本上,每行上的新 Y 列值将告诉我们 X 列值的百分比更大前 10 条记录(包括当前记录)大于 1。以下是我正在使用的代码,但得到的结果与预期不同
[编辑]
def count_pcnt(x):
return ((np.sum(x > 1) / len(x)) * 100.0)
def run():
df = pd.DataFrame(
data={'X': ['8.12', '7.13', '-5.30', '3.21', '4.21', '3.14','8.65',
'7.33', '-5.10', '3.01']
})
df['Y'] = df['X'].rolling(window=10, min_periods=1).apply(lambda x:
count_pcnt(x)).apply(int)
预期结果[已编辑]
X Y(%)
0 8.12 100
1 7.13 100
2 -5.30 66.67
3 3.21 75
4 4.21 80
5 3.14 83.33
6 8.65 85.71
7 7.33 87.50
8 -5.10 77.77
9 3.01 80
实际
X Y
0 8.12 100
1 7.13 100
2 -5.30 0
3 3.21 0
4 4.21 0
5 3.14 0
6 8.65 0
7 7.33 0
8 -5.10 0
9 3.01 0
更新我使用了下面推荐的这个选项并且它有效。虽然还有其他选择,但我觉得这更干净
df['Y'] = df['X'].astype(float)
.rolling(window=w, min_periods=1)
.apply(lambda x: (x>1).mean()) * 100
如果您想根据接下来的 10 行而不是前 10 行来计算列值 - 下面是解决方案(感谢提供它的 jezrael)
df['Y'] = (df['X'].astype(float).iloc[::-1].rolling(window=10, min_periods=1).apply(lambda x: (x>1).mean()) * 100)[::-1]
【问题讨论】:
-
对于前 9 条记录,它没有大小为 9 的窗口,这就是您看到 NaN 的原因。我想要么手动设置它们,要么逐渐增加窗口大小直到达到 9。
-
另外,您的预期结果看起来不对。为什么第一条记录的值应该是 80%?它之前没有任何记录。为什么第二条记录的值是 77%?它之前的所有记录的X值都大于1,所以不应该是100%吗?
-
@HavanAgrawal 我相信 OP 的价值观是颠倒的,除了这里和那里的计算错误。
-
@HavanAgrawal 更正了值
标签: python pandas numpy dataframe artificial-intelligence