将Pandas Dataframe行中的所有值相乘

时间:2017-04-20 21:16:01

标签: python pandas numpy dataframe

这基本上是数据帧:

      col1    col2    col3    label
row1   1       0       1        1
row2   0       0       0        1
row3   1       1       1        0
row4   1       2       1        0

我基本上需要它遍历每一行,如果label = 0,则将行中的所有值乘以-1。

我尝试了很多不同的方法,包括:

df.ix[3] = df.ix[3].multiply(-1)

返回:

  

SettingWithCopyWarning:   尝试在DataFrame的切片副本上设置值。   尝试使用.loc [row_indexer,col_indexer] = value而不是

我也尝试删除行并替换,因为索引改变而无效。

3 个答案:

答案 0 :(得分:5)

In [156]: df.loc[df.label==0, df.columns.drop('label')] = \
              df.loc[df.label==0, df.columns.drop('label')].mul(-1)

In [157]: df
Out[157]:
      col1  col2  col3  label
row1     1     0     1      1
row2     0     0     0      1
row3    -1    -1    -1      0
row4    -1    -2    -1      0

或更短的版本:

In [160]: df.loc[df.label==0, df.columns.drop('label')] *= -1

In [161]: df
Out[161]:
      col1  col2  col3  label
row1     1     0     1      1
row2     0     0     0      1
row3    -1    -1    -1      0
row4    -1    -2    -1      0

答案 1 :(得分:5)

使用broadcastingmasking的一种方法,基本上使用0乘以-1的事实不会改变0,所以我们可以将整个行乘以-1,其label值对应0s -

df[(df.label==0)] *= -1

示例运行 -

In [70]: df
Out[70]: 
      col1  col2  col3  col4  label
row1     1     0     1     3      1
row2     0     0     0     2      1
row3     1     1     1     5      0
row4     1     2     1     7      0

In [71]: df[(df.label==0)] *= -1

In [72]: df
Out[72]: 
      col1  col2  col3  col4  label
row1     1     0     1     3      1
row2     0     0     0     2      1
row3    -1    -1    -1    -5      0
row4    -1    -2    -1    -7      0

答案 2 :(得分:1)

或者,您可以为行式操作运行apply

df = df.apply(lambda row: row*-1 if row['label'] == 0 else row, axis=1)

print(df)    
#       col1  col2  col3  label
# row1     1     0     1      1
# row2     0     0     0      1
# row3    -1    -1    -1      0
# row4    -1    -2    -1      0