假设我们有一个像这样的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产生最后两个条目的平均值。
答案 0 :(得分:2)
您可以先DataFrame.shift
DataFrame.cumsum
到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
来自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>