【问题标题】:Elementwise mean of numpy arrays from pandas dataframe cells来自 pandas 数据框单元格的 numpy 数组的元素平均值
【发布时间】:2018-01-24 20:10:52
【问题描述】:

我有一个 2x1 的 pandas 数据框,其中 2 个单元格包含 numpy 数组:

>>> import numpy as np
>>> import pandas as pd
>>> a0 = np.array([[1, 2], [2, 2]])
>>> a1 = np.array([[3, 2], [1, 1]])
>>> df = pd.DataFrame([[a0], [a1]])

我可以按如下方式计算两个数组的元素平均值:

>>> np.mean(df[0])
array([[ 2. ,  2. ],
       [ 1.5,  1.5]])

现在我想考虑至少有一个数组包含 nan/s 的情况,例如

>>> a0 = np.array([[1, 2], [2, np.nan]])
>>> a1 = np.array([[3, 2], [1, 1]])
>>> df = pd.DataFrame([[a0], [a1]])

上面使用的平均方法给出了

>>> np.mean(df[0])
array([[ 2. ,  2. ],
       [ 1.5,  nan]])

正如预期的那样。我希望 nan/s 被忽略。我本来希望以下工作

>>> np.nanmean(df[0])
array([[ -4.,  -4.],
       [ -3.,  nan]])

但显然不是。

所以,我的问题是:如何计算包含在 pandas 数据帧的单元格中的 numpy 数组的元素方式?

【问题讨论】:

  • 两个问题:您可能不会混合索引 0 和列 0,对吧?也许命名数据框列可能会有所帮助。而且,np.nanmean(df[0]) 的预期结果是array([[ 2. , 2. ], [ 1.5, 1]])?
  • (i) 如果我使用例如,我会得到相同的结果。 'c' 作为列名。 (ii) 是的,预期结果是np.array([[2., 2.], [1.5, 1.]])

标签: python arrays pandas numpy


【解决方案1】:

我不确定我是否理解正确,部分原因是我对索引 0 和列名 0 感到困惑......但这里有一个想法:

In [1]: import numpy as np

In [2]: import pandas as pd

In [3]: a0 = np.array([[1, 2], [2, np.nan]])

In [4]: a1 = np.array([[3, 2], [1, 1]])

In [5]: df = pd.DataFrame([[a0], [a1]])

In [6]: df
Out[6]: 
                          0
0  [[1.0, 2.0], [2.0, nan]]
1          [[3, 2], [1, 1]]

In [7]: df[0].as_matrix()
Out[7]: 
array([array([[  1.,   2.],
       [  2.,  nan]]),
       array([[3, 2],
       [1, 1]])], dtype=object)

In [8]: np.array( [ item for item in df[0].as_matrix() ] )
Out[8]: 
array([[[  1.,   2.],
        [  2.,  nan]],

       [[  3.,   2.],
        [  1.,   1.]]])

In [9]: np.nanmean( np.array( [ item for item in df[0].as_matrix() ]
   ...:  ), axis=0 )
Out[9]: 
array([[ 2. ,  2. ],
       [ 1.5,  1. ]])

In [10]: np.nanmean( np.array( [ item for item in df[0].as_matrix() 
    ...: ] ), axis=1 )
Out[10]: 
array([[ 1.5,  2. ],
       [ 2. ,  1.5]])

In [11]: np.nanmean( np.array( [ item for item in df[0].as_matrix() 
    ...: ] ), axis=2 )
Out[11]: 
array([[ 1.5,  2. ],
       [ 2.5,  1. ]])

【讨论】:

  • 很高兴它有帮助!
最近更新 更多