2017-10-04 128 views
0

我有一個DF,看起來像這樣:操作與列熊貓

I_0 I_1 I_2 10 20 30 SF 
q 
0 2 3 4 5 1 1 0.2 
1 5 4 3 4 7 8 0.3 
2 4 8 7 9 8 7 0.4 

我想使操作就可以了,如:

  • 多組序列10,20和30 SF
  • 從I_0,I_1和I_2中減去這些新列。

例如:

I_0 - (column 10 * SF) 
I_1 - (column 20 * SF) 
I_2 - (column 30 * SF) 

然後重命名計算列於I_0_sub,I_1_sub和I_2_sub。

到目前爲止,我已經試過這樣:

df = pd.merge(df1, df2, how = "left", left_index = True, right_index = True) 
df["SF"] = df["I_q_2"]/df[10] 
test = df.subtract(df2*SF, axis=0) 
test.drop(labels=["10", "20", "30", "SF"], axis = "columns", inplace = True) 
test = test.add_suffix("_sub") 

獲取楠爲DF。

任何幫助,將不勝感激。

回答

2

使用filter的選擇列始於I

df1 = df.filter(regex='^I') 
print (df1) 
    I_0 I_1 I_2 
q    
0 2 3 4 
1 5 4 3 
2 4 8 7 

然後通過mul選擇的子集,多列:

df2 = df[["10", "20", "30"]].mul(df["SF"], axis=0) 
print (df2) 
    10 20 30 
q    
0 1.0 0.2 0.2 
1 1.2 2.1 2.4 
2 3.6 3.2 2.8 

末。減去由sub - 但列是不同的,所以轉換值到numpy array

df = df1.sub(df2.values, 0).add_suffix('_sub') 
print (df) 
    I_0_sub I_1_sub I_2_sub 
q       
0  1.0  2.8  3.8 
1  3.8  1.9  0.6 
2  0.4  4.8  4.2 

如果列名在兩個df不一樣得到NaN S,因爲數據不對齊:

print (df1.sub(df2, axis=0)) 
    10 20 30 I_0 I_1 I_2 
q       
0 NaN NaN NaN NaN NaN NaN 
0 NaN NaN NaN NaN NaN NaN 
2 NaN NaN NaN NaN NaN NaN