2017-05-28 113 views
2

在下面参照索引我的数据,收入是正值,而成本即直接成本,人力资源,供应&材料,其他业务成本是以下金融惯例负值。熊猫反签选中的索引

Sample Data

我怎样才能变换数据,以便:

  • 收入排是不变的
  • 其他行都已它们的值-1

回答

2

使用倒置,即乘difference的地方是mul必要多的所有行:

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 

另一种解决方案是创建Series多个与to_series + map

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 

或者simplier使用numpy.where用于转换阵列通过掩模mul

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 
+0

这个作品很好,谢谢!使用最后一个,因为它是最简单的 – idazuwaika

+0

很高兴可以帮助,最后是最好的;)美好的周末! – jezrael

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我们得到1Revenue否则-1。现在我们只需要将这个乘以values数组中的每一列。我们使用numpy广播。为了播出,我们把的-11我们的一维数组到的N×1个阵列[:, None]。现在我们可以乘以每一列。

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