从由数组组成的数据框中取列的平均值

Posted

技术标签:

【中文标题】从由数组组成的数据框中取列的平均值【英文标题】:Take mean of column from dataframe that consist of arrays 【发布时间】:2021-08-27 12:28:57 【问题描述】:

我正在尝试对由数组[x,y,z] 组成的数据框中的每一列求平均值。此外,数组可以填充 NaN 值[np.nan, np.nan, np.nan]. 我试过这个:

np.mean([df[col].mean() for col in df.columns], axis=0)

但这不起作用:/ 任何建议将不胜感激

【问题讨论】:

最好将数组explode 放入单值单元格中。 【参考方案1】:

你是这个意思吗?

df=pd.DataFrame('score1':[2010,np.nan,2010,2011,2011,2011],
'score2':[1,2,np.nan,1,2,3],
'score3':[np.nan,np.nan,32,14,15,16])

print([df[col].mean() for col in df.columns])

输出

[2010.6, 1.8, 19.25]

【讨论】:

是的,这就是我想要完成的。但不是前。 'year'[2010,np.nan,2010,2011,2011,2011] 我有 'year'[array[nan,nan,nan],array[12,10,8],array[nan,nan,nan]等] 如果你能在问题中展示你的例子会更清楚吗?【参考方案2】:

假设您的数据框如下所示:

import pandas as pd
import numpy as np

data = "foobar":["foo", "bar", "baz"], 
        "year":[[np.nan,np.nan,np.nan], 
                [12,10,8], 
                [np.nan,np.nan,np.nan]]

df = pd.DataFrame(data)
  foobar             year
0    foo  [nan, nan, nan]
1    bar      [12, 10, 8]
2    baz  [nan, nan, nan]

...您可以使用apply 构建一个包含平均值的新列:

df["means"] = df.year.apply(np.mean)
result_list = df.means.values # array([nan, 10., nan])
  foobar             year  means
0    foo  [nan, nan, nan]    NaN
1    bar      [12, 10, 8]   10.0
2    baz  [nan, nan, nan]    NaN

但是,根据您还想对数据做什么,最好将explode 序列放入单个单元格中以获得更多pandaesque结构:

df = df.explode(column="year")
df["year"] = df.year.astype(float) # tell Pandas it's numerical data

  foobar  year
0    foo   NaN
0    foo   NaN
0    foo   NaN
1    bar  12.0
...

现在只需使用默认操作来获取按foobar 或您的列名分组的值。

mean_df = df.groupby("foobar").mean()
         year
foobar      
bar     10.0
baz      NaN
foo      NaN

【讨论】:

以上是关于从由数组组成的数据框中取列的平均值的主要内容,如果未能解决你的问题,请参考以下文章

用相关列的平均值替换数据框中的 NaN 值的函数

用 Python 用该列的平均值减去数据框中的每一列

试图弄清楚如何使用列表返回数据框中每一列的平均值

在 Pandas 数据框中查找每三列的平均值

Pandas 通过取列之间的平均值来合并两个数据框

如何使用Scala计算Spark中数据框中列的开始索引和结束索引之间的行的平均值?