基于列后缀的条件数据帧计算

时间:2016-02-26 09:52:22

标签: python pandas

如何根据列名的最后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 

感谢您的帮助!

2 个答案:

答案 0 :(得分: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())

编辑:首先是错误解释的问题,以计算所有出价值的均值,而不仅仅是行。

答案 1 :(得分:1)

IIUC您需要使用列名称中包含bid的列对数据框进行子集化并计算平均值。您可以使用str.contain对列进行子集,使用loc查找列的值,并为行轴获取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)