2017-05-28 110 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