如何在pandas DataFram中计算块平均值

2024-04-25 12:23:25 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我们有这样一个数据帧。在

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)

在我的具体案例中

^{pr2}$

我想计算每个非零块的平均值。例如,倒数第二列(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个块,一个出现在index=4,value=0.136868处,另一个出现在index=8,9,value=[0.6510601040841]处。我要每个街区的平均值。在

澄清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得出最后两个条目的平均值。在


Tags: columns数据dataframedfindexvaluenprandom
1条回答
网友
1楼 · 发布于 2024-04-25 12:23:25

您可以首先通过^{}^{}df1获得一组连续值:

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的列,每个来自{}的组,使用^{}

^{pr2}$

如果需要所有列的输出,请使用带^{}的列表理解:

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

相关问题 更多 >