我有以下数据集,我正在尝试创建一个条件,如果百分比单元格中的值为正,我希望匹配单元格显示后续的百分比值,例如(i + 1)。但是,我想问一下如何在不使用循环的情况下执行此操作。例如,在第0行和匹配中,它将显示值-0.34。
User Percent Match
0 A 0.87 NaN
1 A -0.34 NaN
2 A 0.71 NaN
3 A -0.58 NaN
4 B -1.67 NaN
5 B -0.44 NaN
6 B -0.72 NaN
7 C 0.19 NaN
8 C 0.39 NaN
9 C -0.28 NaN
10 C 0.53 NaN
此外,我如何能够在百分比单元格中对后续两个值进行正数进行求和。我有以下代码,但我在索引行位置时出错。
df1.ix[df1.Percent >=0, ['Match']] = df1.iloc[:1]['Match']; df1
答案 0 :(得分:3)
对于第一部分,您可以使用具有布尔条件的loc
和shift
:
In [5]:
df.loc[df['Percent']>0,'Match'] = df['Percent'].shift(-1)
df
Out[5]:
User Percent Match
0 A 0.87 -0.34
1 A -0.34 NaN
2 A 0.71 -0.58
3 A -0.58 NaN
4 B -1.67 NaN
5 B -0.44 NaN
6 B -0.72 NaN
7 C 0.19 0.39
8 C 0.39 -0.28
9 C -0.28 NaN
10 C 0.53 NaN
总结您可以执行以下操作:
In [15]:
def func(x):
return df['Percent'].iloc[x.name-2:x.name].sum()
df['sum'] = df[df['Percent']>0][['Percent']].apply(lambda x: func(x), axis=1)
df
Out[15]:
User Percent Match sum
0 A 0.87 -0.34 0.00
1 A -0.34 NaN NaN
2 A 0.71 -0.58 0.53
3 A -0.58 NaN NaN
4 B -1.67 NaN NaN
5 B -0.44 NaN NaN
6 B -0.72 NaN NaN
7 C 0.19 0.39 -1.16
8 C 0.39 -0.28 -0.53
9 C -0.28 NaN NaN
10 C 0.53 NaN 0.11
这使用了一个轻微的技巧来掩盖df并返回感兴趣的col但强制到df(使用双方括号[[]]
),这样我们就可以调用apply
并使用{{1}逐行迭代。这允许我们通过axis=1
属性访问行索引。然后我们可以使用它来切片df并返回.name
。