如何计算pandas DataFrame中的块平均值

时间:2016-10-24 03:04:48

标签: python pandas

假设我们有一个像这样的DataFrame。

df = pd.DataFrame(np.random.randn(10,5), columns=['a','b','c','d','e'])
idx = np.random.randint(0,2,(10,5))
df = abs(df * idx)

在我的具体案例中

    a   b   c   d   e
0   0.000000    0.000000    0.000000    0.000000    0.976492
1   0.000000    3.589563    0.000000    0.400287    0.000000
2   0.000000    0.000000    0.247323    0.000000    0.000000
3   0.000000    0.000000    0.000000    0.079501    0.000000
4   0.136868    0.000000    0.223572    0.153744    0.000000
5   0.000000    0.000000    0.494390    0.311590    0.000000
6   0.000000    0.000000    0.756897    0.000000    0.039769
7   0.000000    0.000000    0.000000    1.006561    0.000000
8   0.651060    0.588797    0.000000    0.000000    0.028943
9   1.040841    0.000000    0.000000    0.000000    0.879489

我想计算每个非零块的平均值。例如,第二列到最后一列(d列)将产生一系列形式:

0    0.000000
1    0.400287
2    0.000000
3    0.11662267564906763
4    0.11662267564906763
5    0.11662267564906763
6    0.000000
7    1.006561
8    0.000000
9    0.000000

澄清:

我对非零块的意思是对于任何给定的列,那些具有连续非零的块的块。例如,列a将具有2个块,一个出现在索引= 4,值= 0.136868,另一个出现在索引= 8,9和值= [0.651060,1040841]。我想要每个街区的平均值。

澄清2: 在列a的情况下,输出将是

0    0.000000
1    0.000000
2    0.000000
3    0.000000
4    0.136868
5    0.000000
6    0.000000
7    0.000000
8    0.8459504999999999
9    0.8459504999999999

其中,位置8,9产生最后两个条目的平均值。

1 个答案:

答案 0 :(得分:2)

您可以先DataFrame.shift DataFrame.cumsumdf1获取连续值组:

a = df != 0
df1 = (a != a.shift()).cumsum()
print (df1)
   a  b  c  d  e
0  1  1  1  1  1
1  1  2  1  2  2
2  1  3  2  3  2
3  1  3  3  4  2
4  2  3  4  4  2
5  3  3  4  4  2
6  3  3  4  5  3
7  3  3  5  6  4
8  4  4  5  7  5
9  4  5  5  7  5

然后df来自df1每个print (df.a.groupby([df1.a]).transform('mean')) 0 0.000000 1 0.000000 2 0.000000 3 0.000000 4 0.136868 5 0.000000 6 0.000000 7 0.000000 8 0.845951 9 0.845951 Name: a, dtype: float64 的{​​{3}}列,groupby

df2 = pd.concat([df[col].groupby([df1[col]]).transform('mean') for col in df], axis=1)
print (df2)
          a         b         c         d         e
0  0.000000  0.000000  0.000000  0.000000  0.976492
1  0.000000  3.589563  0.000000  0.400287  0.000000
2  0.000000  0.000000  0.247323  0.000000  0.000000
3  0.000000  0.000000  0.000000  0.181612  0.000000
4  0.136868  0.000000  0.491620  0.181612  0.000000
5  0.000000  0.000000  0.491620  0.181612  0.000000
6  0.000000  0.000000  0.491620  0.000000  0.039769
7  0.000000  0.000000  0.000000  1.006561  0.000000
8  0.845951  0.588797  0.000000  0.000000  0.454216
9  0.845951  0.000000  0.000000  0.000000  0.454216

如果需要输出所有列,请使用列表理解transform

<!DOCTYPE html>
<html>
    <body>
        <script src="tst.js">
        </script>
    </body>
</html>