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

标签 python arrays pandas numpy dataframe

给定一个包含 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/

相关文章:

c++ - 类数组 'undefined' C++

c - 自由二维数组列

python - 如何 reshape 数据框(列中的不同类型)

python - 使用 scipy.sparse.diags 的 Scipy 三对角矩阵

python - Django,重定向的网址不正确

c - C中如何使用scanf同时扫描double和char到double数组中

python - Pandas pd.merge "TypeError: string indices must be integers, not str"

python - 为什么 str.match 使用正则表达式在 Pandas 中不起作用

python - (Python/Linux) 通过 python 或 os.system 命令无延迟地播放 wav 文件

python - 如何从 Pandas 系列中获取最大值和名称?