使用摘要信息的平均数据帧

时间:2017-12-18 20:36:55

标签: python pandas

我有一个充满历史数据的数据框,并不是每一行都有一个"完整的"数据集。在下面的示例中,仅收集参数" C"在一排。我希望能够获得该数据集的平均值,其中如果实际样本的总数> 1,则仅执行平均值。 Ñ

import pandas as pd
import numpy as np

columns = ['A', 'B', 'C']
rows = range(5)
data = [
    [5, 2, np.NaN],
    [2, 2, np.NaN],
    [4, 4, 3],
    [1, 2, np.NaN],
    [1, np.NaN, np.NaN]
]

history = pd.DataFrame(columns=columns, index=rows, data=data)

non_nan_values = history.notnull().sum()  # -> A: 5, B: 4, C: 1
means = history.mean()  # -> A: 2.6, B: 2.5, C: 3.0

如果我尝试history[history.notnull().sum() > 3].mean(),我会得到一个IndexingError,因为这实际上并不是一个有效的掩码。

除了根据我的non_nan_values变量追溯迭代平均变量并用NaN替换某些值之外,还有更好的解决方案吗?目标结果将是一个平均变量,如下所示:

A: 2.6, B: 2.5, C: NaN

1 个答案:

答案 0 :(得分:1)

如果所有列都是数字,则可以使用空计数在计算之后屏蔽mean而不是之前:

history.mean().where(history.notnull().sum() > 3)
#A    2.6
#B    2.5
#C    NaN
#dtype: float64

使用to_dict

将结果转换为字典很容易
history.mean().where(history.notnull().sum() > 3).to_dict()
# {'B': 2.5, 'C': nan, 'A': 2.6000000000000001}