这基本上是数据帧:
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而不是
我也尝试删除行并替换,因为索引改变而无效。
答案 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)
使用broadcasting
和masking
的一种方法,基本上使用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