gpt4 book ai didi

python - 如何计算 pandas DataFrame 中的 block 平均值

转载 作者:太空宇宙 更新时间:2023-11-04 03:03:27 25 4
gpt4 key购买 nike

假设,我们有一个像这样的 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

我想计算每个非零 block 的均值。例如,倒数第二列(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

澄清:

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

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

最佳答案

您可以先通过 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

然后 groupbydf 中的列按 df1 中的每组 transform :

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

如果需要所有列的输出,请使用带有 concat 的列表推导式:

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

关于python - 如何计算 pandas DataFrame 中的 block 平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40210143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com