我有一个充满历史数据的数据框,并不是每一行都有一个"完整的"数据集。在下面的示例中,仅收集参数" 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
答案 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}