2016-02-26 108 views
-1

如何基於列名稱的最後3個字母來平均數據框中的列。我正在嘗試創建一個新列,以便在我的數據框中爲我提供所有「出價」的平均值。基於列後綴的條件數據框計算

我的數據框看起來是這樣的:

JPM_bid, JPM_ask, Socgen_bid, Socgen_ask, UBS_bid, UBS_ask ....so forth 
0 1.01556 1.01557 1.01552  1.01559  1.01555 1.01558 

現在我正在做的計算是這樣的:

df['JPM_spread'] =  df['JPM_ask'].astype(float) - df['JPM_ask'].astype(float) 
df['JPM_midpoint'] = (df['JPM_ask'].astype(float) + df['JPM_ask'].astype(float))/2 
df['AVG_bid'] = "" 
df['AVG_ask'] = "" 
df['JPM_bid_depth'] = "" 
...so forth 

感謝您的幫助!

+0

所以你之後:'bid_cols = df.columns.str.contains(「出價」)的山坳在bid_cols中:df ['ave_'+ col] = #some calc'? – EdChum

+0

我正在尋找一種方法來執行所有出價或所有問題的計算。我希望'df ['AVG_bid'] = #avg該行中的所有出價 - 忽略提問列'。 – Tom

回答

1

IIUC您需要在列名稱中包含bid的列與您的數據框的子集並計算平均值。你可以用str.containloc子集的欄目,找到價值爲列,並得到mean爲行軸:

df.loc[:, df.columns.str.contains('bid')].mean(axis=1) 

有了您的數據幀的一部分:

In [57]: df 
Out[57]: 
    JPM_bid, JPM_ask, Socgen_bid, Socgen_ask, UBS_bid, UBS_ask 
0 1.01556 1.01557  1.01552  1.01559 1.01555 1.01558 

In [58]: df.loc[:, df.columns.str.contains('bid')].mean(axis=1) 
Out[58]: 
0 1.015543 
dtype: float64 

編輯

要排除0,您可以將您的df與0用於子集數據框,然後使用mean。這將是更好,如果你連接代碼或例如這樣的數據幀,但沒有數據下面應該工作:

df_subset = df.loc[:, df.columns.str.contains('bid')] 
df_subset[df_subset != 0].mean(axis=1) 
+0

這很好,只有一行!問題,有沒有辦法添加將跳過列「0」的東西。我原本在我的腳本'df = df.replace(np.nan,「」,regex = True)''中有這個,但是我不得不將它改爲0,因爲我得到了這個錯誤'ValueError:could not convert string to float:' – Tom

+0

@Tom你想用'bid'跳過列但沒有'0'嗎?或者你正在談論單元格中的「0」?如果你需要將數值轉換爲數值,並將非數值賦值爲'NaN',你可以使用'df.apply(lambda x:pd.to_numeric(x),errors ='coerce')'然後你可以使用'fillna 0)''用0填充'NaN' .. –

+0

我想用投標來平均所有欄 - 然而,總共有22欄有出價,其中一些欄有0欄。所以當我運行你給我的函數時,平均值會很大,因爲它包含了0s – Tom

1

首先獲取名稱中包含'bid'的所有列名稱。

columns_with_bid = [column for column in df.columns if '_bid' in column] 

比篩選數據框並遍歷行。

df['bid_mean'] = list(row[1].mean() for row in df.filter(columns_with_bid).iterrows()) 

編輯:首先曲解了問題,以計算所有出價值的均值,而不是僅針對行。