按DataFrame的主列级别分组,然后在每个子级别上应用函数

时间:2019-05-27 13:17:14

标签: python pandas dataframe pandas-groupby multi-index

我有一个具有以下结构的数据框。 我要完成的工作是按主索引级别(TCKRATCKRB)对数据帧进行分组,然后在每个应用范围内应用一个函数,该函数将计算ASK - BID并仅输出两列用于每个级别。

df = pd.DataFrame(np.random.rand(10, 4))*100
df.columns = pd.MultiIndex.from_tuples([('TCKR_A', 'BID'), ('TCKR_A', 'ASK'),
                                      ('TCKR_B', 'BID'), ('TCKR_B', 'ASK')])
df.columns.names = ['Sec', 'Fld']

df

>> df
Sec        TCKR_A                   TCKR_B
Fld   BID          ASK          BID         ASK
0   8.183207    36.627854   51.926086   18.809108
1   79.111061   39.580137   56.137122   41.631460
2   48.757876   11.297864   50.613713   56.089854
3   12.320957   38.624896   81.759719   88.549522
4   8.659632    36.967937   50.086826   20.728593
5   56.019027   77.685117   60.440403   9.726945
6   47.956368   20.087774   31.204852   99.893489
7   21.328761   32.824996   14.175482   13.154170
8   13.344390   90.940015   7.617241    50.501808
9   64.513930   34.020330   50.607016   38.710182


我试图避免使用循环,尽管这样做是可行的,因为我可以将操作应用于每个主要级别。 到目前为止,我已经尝试使用pd.df.groupby(),但没有运气,

df.groupby('Security', level=0).apply(lambda x: x.ASK - x.BID)

>> AttributeError: 'DataFrame' object has no attribute 'ASK'

1 个答案:

答案 0 :(得分:3)

这里不需要分组,因为对于{第一级} Multiindex具有相同列名的数据帧,MultiIndex和可能通过DataFrame.xs选择列,因此可以减去:

df1 = df.xs('ASK', level=1, axis=1) - df.xs('BID', level=1, axis=1)
print (df1)
Sec     TCKR_A     TCKR_B
0   -51.040171   1.390744
1   -58.132705  20.100789
2   -47.563213 -18.537630
3    72.634983  83.624726
4    48.298953  68.488183
5     6.468167  53.791475
6   -42.180559 -23.153447
7    -3.664986   3.900489
8    14.290560 -10.863276
9    -5.373369  11.897776

详细信息

print (df.xs('ASK', level=1, axis=1))
Sec     TCKR_A     TCKR_B
0    39.308051  63.787740
1    29.917202  90.320616
2    40.574980  26.707032
3    88.921470  98.472349
4    51.535075  88.601087
5    57.830159  83.719740
6    10.484424   4.659494
7    47.242629  94.349222
8    84.629795  81.936188