如果条件为真,使用Pandas(Python)如何在列中插入值

时间:2016-01-23 20:04:54

标签: python pandas

我有以下数据集,我正在尝试创建一个条件,如果百分比单元格中的值为正,我希望匹配单元格显示后续的百分比值,例如(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

1 个答案:

答案 0 :(得分:3)

对于第一部分,您可以使用具有布尔条件的locshift

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