答案 0 :(得分:3)
difference
的所有行mul
使用to_series
:
cols = df.index.difference(['Revenue'])
df.loc[cols] = df.loc[cols].mul(-1)
样品:
df = pd.DataFrame({'A':[1,2,3],
'B':[-4,5,6],
'C':[7,-8,9],
'D':[1,3,-5],
'E':[5,-3,6],
'F':[-7,4,3]},
index=['Revenue', 'Direct Cost','Manpower'])
print (df)
A B C D E F
Revenue 1 -4 7 1 5 -7
Direct Cost 2 5 -8 3 -3 4
Manpower 3 6 9 -5 6 3
cols = df.index.difference(['Revenue'])
df.loc[cols] = df.loc[cols].mul(-1)
print (df)
A B C D E F
Revenue 1 -4 7 1 5 -7
Direct Cost -2 -5 8 -3 3 -4
Manpower -3 -6 -9 5 -6 -3
为map
+ numpy.where
的多个人创建了另一个解决方案Series
:
s = (df.index.to_series() == 'Revenue').map({True:1, False:-1})
print (s)
Revenue 1
Direct Cost -1
Manpower -1
dtype: int64
df = df.mul(s, axis=0)
print (df)
A B C D E F
Revenue 1 -4 7 1 5 -7
Direct Cost -2 -5 8 -3 3 -4
Manpower -3 -6 -9 5 -6 -3
或者简化使用mul
通过掩码使用{{3}}转换数组:
df = df.mul(np.where(df.index == 'Revenue', 1, -1), axis=0)
print (df)
A B C D E F
Revenue 1 -4 7 1 5 -7
Direct Cost -2 -5 8 -3 3 -4
Manpower -3 -6 -9 5 -6 -3
答案 1 :(得分:1)
使用@ jezrael的设置
df = pd.DataFrame({'A':[1,2,3],
'B':[-4,5,6],
'C':[7,-8,9],
'D':[1,3,-5],
'E':[5,-3,6],
'F':[-7,4,3]},
index=['Revenue', 'Direct Cost','Manpower'])
从布尔数组构建-1
/ +1
数组。直接在底层values
数组上操作。这非常快。
当索引值为Revenue
时,我们得到True
,否则为False
。乘以2
,2
等于Revenue
,否则为0
。减去1
,1
否Revenue
时我们会-1
。现在我们只需要将它乘以values数组中的每一列。我们使用numpy广播。为了进行广播,我们将-1
和1
的1d数组转换为带有[:, None]
的n x 1数组。现在我们可以将每一列相乘。
df.values[:] *= ((df.index.values == 'Revenue') * 2 - 1)[:, None]
df
A B C D E F
Revenue 1 -4 7 1 5 -7
Direct Cost -2 -5 8 -3 3 -4
Manpower -3 -6 -9 5 -6 -3