基于来自另一个数据框的条件的数据框摘要数学?

时间:2018-12-28 02:43:58

标签: python pandas dataframe

我拥有3D数据量,但无法安装推荐的熊猫xarray package

df_values

   | a    b    c
-----------------
0  | 5    9    2
1  | 6    9    5
2  | 1    6    8  

df_condition

   | a    b    c
-----------------
0  | y    y    y
1  | y    n    y
2  | n    n    y

我知道我可以像这样获得df_values中所有值的平均值。

df_values.stack().mean()


问题...
average of df_values中找到df_condition == "y"的最简单方法是什么?

4 个答案:

答案 0 :(得分:1)

IIUC布尔掩码

df[c.eq('y')].mean().mean()
6.5

或者您可能想要

df[c.eq('y')].sum().sum()/c.eq('y').sum().sum()
5.833333333333333

答案 1 :(得分:1)

假设您希望在df_condition == 'y'处找到所有值的平均值:

res = np.nanmean(df_values[df_condition.eq('y')])  #5.833333333333333

使用NumPy比熊猫stackwhere便宜得多:

# Pandas 0.23.0, NumPy 1.14.3
n = 10**5
df_values = pd.concat([df_values]*n, ignore_index=True)
df_condition = pd.concat([df_condition]*n, ignore_index=True)

%timeit np.nanmean(df_values.values[df_condition.eq('y')])       # 32 ms
%timeit np.nanmean(df_values.where(df_condition == 'y').values)  # 88 ms
%timeit df_values[df_condition.eq('y')].stack().mean()           # 107 ms

答案 2 :(得分:1)

仅使用如下所示的pandas DataFrame和Series方法,即可获取条件为“ y”的所有值的平均值。

df_values[df_condition.eq('y')].stack().mean()  # 5.833333333333333

df_values[df_condition == 'y'].stack().mean()  # 5.833333333333333

这很简单吗? :)

答案 3 :(得分:1)

尝试:

np.nanmean(df.where(dfcon == 'y').values)

输出:

5.8333333333