为多索引pandas数据帧中的每个值创建直方图

时间:2017-03-03 23:52:09

标签: python pandas

以下是我的熊猫数据框的一小部分。我希望能够为count中的每个值获得单独的'vel_x'直方图(​​计数,箱)。有没有一种快速,内置的方法来做到这一点,而不只是循环计数中的每个值?

+-------+-------+-------+-------+--------+----+--------+
|       |       | x_loc | y_loc | vel_x  | …  |  vel_z |
+-------+-------+-------+-------+--------+----+--------+
| count | slice |       |       |        |    |        |
|   1   | 3     |     4 |     0 |     96 | 88 |     35 |
|       | 4     |    10 |     2 |     54 | 42 |     37 |
|       | 5     |     9 |    32 |      8 | 70 |     34 |
|       | 6     |    36 |    89 |     69 | 46 |     78 |
|   2   | 5     |    17 |    41 |     48 | 45 |     71 |
|       | 6     |    50 |    66 |     82 | 72 |     59 |
|       | 7     |    14 |    24 |     55 | 20 |     89 |
|       | 8     |    76 |    36 |     13 | 14 |     21 |
|   3   | 5     |    97 |    19 |     41 | 61 |     72 |
|       | 6     |    22 |     4 |     56 | 82 |     15 |
|       | 7     |    17 |    57 |     30 | 63 |     88 |
|       | 8     |    83 |    43 |     35 |  8 |      4 |
+-------+-------+-------+-------+--------+----+--------+

我尝试了很多方法(应用,地图等),但我无法让它们中的任何一种工作。每种方法只将映射函数应用于所有行值。

基本上,我想将它映射到下面的count(count_value)中的每个值:

def create_histogram(data, count_value):
    values, bin_edges = np.histogram(data.loc[count_value, 'vel_x'])
    return values

然后是这样的:

data.index.get_level_values('Count').map(create_histrogram(data))

另外,作为参考,这是我目前可以执行我想要的方式,但效率不高,因为我的数据帧非常大。

for count_value in data.index.get_level_values('Count').unique:
    values, bin_edges = np.histogram(data.loc[count_value, 'vel_x'])

然后可以将返回的值存储在另一个数组中。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

如何将groupbylevel param一起使用:

  

级别:int,级别名称或此类序列,默认为否如果是轴   是一个MultiIndex(层次结构),按特定级别或级别分组

for count, sdf in df.groupby(level=0):
    values, bin_edges = np.histogram(sdf.loc[count, 'vel_x'])

<强>更新

由于您认为mean(level=level)的工作方式更好,您也可以尝试以mean source code为灵感的方式:

df['vel_x'].groupby(level=0).aggregate(np.histogram)