gpt4 book ai didi

python - Pandas - 在带有 numpy 数组的 MultiIndexed DataFrame 上执行 mean()

转载 作者:行者123 更新时间:2023-12-04 01:18:01 25 4
gpt4 key购买 nike

给定一个包含 Numpy 数组的多索引 Pandas DataFrame,我想知道如何获取给定索引级别的每列的平均值。

>>> pd.__version__
'1.0.5'
>>> a = np.array(range(20)).reshape(-1,2)
>>> d = pd.concat([pd.DataFrame({(i%len(a)//2,i%2): {'a': np.array(v), 'b': np.array([4,4])}}).T for i, v in enumerate(a)])
>>> d
a b
0 0 [0, 1] [4, 4]
1 [2, 3] [4, 4]
1 0 [4, 5] [4, 4]
1 [6, 7] [4, 4]
2 0 [8, 9] [4, 4]
1 [10, 11] [4, 4]
3 0 [12, 13] [4, 4]
1 [14, 15] [4, 4]
4 0 [16, 17] [4, 4]
1 [18, 19] [4, 4]
>>> d['a'].mean()
array([ 9., 10.])
>>> d['b'].mean()
array([4., 4.])

到目前为止一切顺利。

问题

当我想执行 .mean() 时问题就来了在所有列或索引的给定级别上。

获取 DataFrame 的平均值而不是 d[<column>]系列,我们只得到 numpy 数组中第一个元素的平均值

>>> d.mean()
a 9.0
b 4.0
Name: 0, dtype: float64

我们在尝试特定索引级别时会出错

>>> d.mean(level=0)
Traceback (most recent call last):
[ ... ]
pandas.core.base.DataError: No numeric types to aggregate
>>> d['a'].mean(level=1)
Traceback (most recent call last):
[ ... ]
pandas.core.base.DataError: No numeric types to aggregate

预期输出

>>> d.mean()
a [9., 10.]
b [4., 4.]
>>> d.mean(level=0)
a b
0 [1, 2] [4, 4]
1 [5, 6] [4, 4]
2 [9, 10] [4, 4]
3 [13, 14] [4, 4]
4 [17, 18] [4, 4]

>>> d['a'].mean(level=1)
0 [8, 9]
1 [10, 11]

我知道 Pandas 假装不能很好地处理 Numpy 数组,但对我来说它看起来像是 Pandas 的一个错误,但我想知道如何解决它?

最佳答案

下面是另一种生成预期输出的方法:

获取多指标级别值:

level_vals_0 = set(d.index.get_level_values(0))
level_vals_1 = set(d.index.get_level_values(1))

生成输出 1:

output = {
'a': [d.loc[(level_vals_0, level_vals_1), 'a'].mean()],
'b': [d.loc[(level_vals_0, level_vals_1), 'b'].mean()]
}

pd.DataFrame(output).T

输出 1:

a   [9.0, 10.0]
b [4.0, 4.0]

生成输出 2:

output = {
'a': [d.loc[i, 'a'].mean() for i in level_vals_0],
'b': [d.loc[i, 'b'].mean() for i in level_vals_0]
}

pd.DataFrame(output)

输出:

a   b
0 [1.0, 2.0] [4.0, 4.0]
1 [5.0, 6.0] [4.0, 4.0]
2 [9.0, 10.0] [4.0, 4.0]
3 [13.0, 14.0] [4.0, 4.0]
4 [17.0, 18.0] [4.0, 4.0]

生成输出 3:

output = {
'a': [d.loc[(level_vals_0, i), 'a'].mean() for i in level_vals_1],
'b': [d.loc[(level_vals_0, i), 'b'].mean() for i in level_vals_1]
}

pd.DataFrame(output)

输出:

a   b
0 [8.0, 9.0] [4.0, 4.0]
1 [10.0, 11.0] [4.0, 4.0]

关于python - Pandas - 在带有 numpy 数组的 MultiIndexed DataFrame 上执行 mean(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63012262/

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