2017-03-17 94 views
2

我有一個數據幀如下:從數據幀的列減去子列

name tag  price 
0 x1  tweak1 1.1 
1 x1  tweak2 1.2 
2 x1  base  1.0 
3 x2  tweak1 2.1 
4 x2  tweak2 2.2 
5 x2  base  2.0 

我想減去價格欄的基礎價格,並創建一個新列如下:

name tag  price sensitivity 
0 x1  tweak1 1.1 0.1 
1 x1  tweak2 1.2 0.2 
2 x1  base  1.0 0.0 
3 x2  tweak1 1.3 -0.7 
4 x2  tweak2 2.4 0.4 
5 x2  base  2.0 0.0 

並最終放下行標記基地得到

name tag  price sensitivity 
0 x1  tweak1 1.1 0.1 
1 x1  tweak2 1.2 0.2 
3 x2  tweak1 1.3 -0.7 
4 x2  tweak2 2.4 0.4 

什麼是在鍋中執行此操作的最佳方法DAS?

+0

你可以包含你曾經使用過的代碼嗎? –

+0

上面的表格是以更大的代碼序列生成的,因此很難包含代碼。實際的表格也大得多,這只是我需要做的操作的表示。 – Bilentor

回答

2

你可以試試這個:

(df.groupby('name', group_keys=False) 
.apply(lambda g: g.assign(sensitivity = g.price - g.price[g.tag == "base"].values)) 
[lambda x: x.tag != "base"]) 

enter image description here


或者另一種選擇,透視表,寬幅,做減法,然後變換回長格式:

wide_df = df.pivot_table(['price'], 'name', 'tag') 
(wide_df.sub(wide_df[('price', 'base')], axis=0) 
.drop(('price', 'base'), 1).stack(level=1) 
.reset_index()) 

enter image description here

+0

你總是給出很好的答案!我只是很難遵守代碼和你的想法。 – MattR

+0

@MattR感謝評論!遵守其他人的代碼總是很難。 :-) – Psidom

1

這裏是我會怎樣解決它:

1)創建用於基

2列)中減去那些列

3)落基(沒有雙關語意)

import pandas as pd 
import numpy as np 
# Creates a column 'Base' If 'Tag' is base and use the value from price 
# if 'Tag' is not base, use 0 
df['Base'] = np.where(df.tag.isin(['base']), df['Price'] ,0) 
# takes the difference of the two columns 
df['difference'] = df['Price'] - df['Base'] 
# Creates a new DF that uses all values except when 'Tag' is base 
df3 = df[df['Tag'] !='Base'] 
print(df3) 

這裏是我用來提出我的代碼的例子。隨意跟隨,如果你想:

import re 
import pandas as pd 
import numpy as np 
df = pd.DataFrame({'A' : [1,1,3,4,5,5,3,1,5,np.NaN], 
        'B' : [1,np.NaN,3,5,0,0,np.NaN,9,0,0], 
        'C' : ['AA1233445','AA1233445', 'rmacy','Idaho Rx','Ab123455','TV192837','RX','Ohio Drugs','RX12345','USA Pharma'], 
        'D' : [123456,123456,1234567,12345678,12345,12345,12345678,123456789,1234567,np.NaN], 
        'E' : ['Assign','Unassign','Assign','Ugly','Appreciate','Undo','Assign','Unicycle','Assign','Unicorn',]}) 
print(df) 

df['Base'] = np.where(df.E.isin(['Assign']), df['A'] ,0) 
df['difference'] = df['B'] - df['Base'] 
df3 = df[df['E'] !='Assign'] 

輸出:

A B   C   D   E Base difference 
1 1.0 NaN AA1233445  123456.0 Unassign 0.0   NaN 
3 4.0 5.0 Idaho Rx 12345678.0  Ugly 0.0   5.0 
4 5.0 0.0 Ab123455  12345.0 Appreciate 0.0   0.0 
5 5.0 0.0 TV192837  12345.0  Undo 0.0   0.0 
7 1.0 9.0 Ohio Drugs 123456789.0 Unicycle 0.0   9.0 
9 NaN 0.0 USA Pharma   NaN  Unicorn 0.0   0.0 
1

我從'name''tag'列進行索引開始。
然後我會減去'base'橫截面。熊貓將爲我們配合。
最後,使用assign + drop + reset_index進行記帳和格式化。

p = df.set_index(['name', 'tag'])[['price']] 

p.assign(sensitivity=p - p.xs('base', level=1)).drop('base', level=1).reset_index() 

    name  tag price sensitivity 
0 x1 tweak1 1.1   0.1 
1 x1 tweak2 1.2   0.2 
2 x2 tweak1 1.3   -0.7 
3 x2 tweak2 2.4   0.4