pandas groupby.mean() 没有按预期忽略 NaN 的问题
Having Issues with pandas groupby.mean() not ignoring NaN as expected
我目前正在尝试获取我的数据帧 (tdf) 中一组的 mean(),但我的数据集中混合了一些 NaN 值和填充值。示例如下
Test #
a
b
1
1
1
1
2
NaN
1
3
2
2
4
3
我的代码需要使用这个数据集,并创建一个包含该集合的均值、标准差和 95% 区间的新数据集。
i = 0
num_timeframes = 2 #writing this in for example sake
new_df = pd.DataFrame(columns = tdf.columns)
while i < num_timeframes:
results = tdf.loc[tdf["Test #"] == i].groupby(["Test #"]).mean()
new_df = pd.concat([new_df,results])
results = tdf.loc[tdf["Test #"] == i].groupby(["Test #"]).std()
new_df = pd.concat([new_df,results])
results = 2*tdf.loc[tdf["Test #"] == i].groupby(["Test #"]).std()
new_df = pd.concat([new_df,results])
new_df['Test #'] = new_df['Test #'].fillna(i) #fill out test number values
i+=1
为简单起见,我将在 while 循环的第一遍中显示所需的输出,仅计算平均值。但是,该问题会影响每一行。测试 #1 的均值的预期输出如下所示:
Test #
a
b
1
2
1.5
但是,包含任何 NaN 行的列正在将整个平均值计算为 NaN,导致如下所示的输出
Test #
a
b
1
2
NaN
我尝试传递 skipna=True,但收到一条错误消息,指出 mean 没有 skipna 参数。我真的在这里不知所措,因为据我了解 df.mean() 默认情况下会忽略 NaN 行。我对 python 的经验有限,因此非常感谢任何帮助。
使用以下内容
DataFrame.mean( axis=None, skipna=True)
我最终通过完全删除 groupby 函数解决了这个问题(我正在查看它并意识到我没有理由在这里调用 groupby 除了 groupby 使我的列保持在正确的方向之外)。我想我会 post 我的解决方案以防万一有人遇到这个问题。
for i in range(num_timeframes):
results = tdf.loc[tdf["Test #"] == i].mean()
results = pd.concat([results, tdf.loc[tdf["Test #"] == i].std()], axis = 1)
results = pd.concat([results, 2*tdf.loc[tdf["Test #"] == i].std()], axis = 1)
results = results.transpose()
results["Test #"] = i
new_df = pd.concat([new_df,results])
new_df.loc[new_df.shape[0]] = [None]*len(new_df.columns)
我所要做的就是转置我的结果,因为 df.mean() 出于某种原因翻转数据帧,这可能是我首先尝试使用 groupby 的原因。
我目前正在尝试获取我的数据帧 (tdf) 中一组的 mean(),但我的数据集中混合了一些 NaN 值和填充值。示例如下
Test # | a | b |
---|---|---|
1 | 1 | 1 |
1 | 2 | NaN |
1 | 3 | 2 |
2 | 4 | 3 |
我的代码需要使用这个数据集,并创建一个包含该集合的均值、标准差和 95% 区间的新数据集。
i = 0
num_timeframes = 2 #writing this in for example sake
new_df = pd.DataFrame(columns = tdf.columns)
while i < num_timeframes:
results = tdf.loc[tdf["Test #"] == i].groupby(["Test #"]).mean()
new_df = pd.concat([new_df,results])
results = tdf.loc[tdf["Test #"] == i].groupby(["Test #"]).std()
new_df = pd.concat([new_df,results])
results = 2*tdf.loc[tdf["Test #"] == i].groupby(["Test #"]).std()
new_df = pd.concat([new_df,results])
new_df['Test #'] = new_df['Test #'].fillna(i) #fill out test number values
i+=1
为简单起见,我将在 while 循环的第一遍中显示所需的输出,仅计算平均值。但是,该问题会影响每一行。测试 #1 的均值的预期输出如下所示:
Test # | a | b |
---|---|---|
1 | 2 | 1.5 |
但是,包含任何 NaN 行的列正在将整个平均值计算为 NaN,导致如下所示的输出
Test # | a | b |
---|---|---|
1 | 2 | NaN |
我尝试传递 skipna=True,但收到一条错误消息,指出 mean 没有 skipna 参数。我真的在这里不知所措,因为据我了解 df.mean() 默认情况下会忽略 NaN 行。我对 python 的经验有限,因此非常感谢任何帮助。
使用以下内容
DataFrame.mean( axis=None, skipna=True)
我最终通过完全删除 groupby 函数解决了这个问题(我正在查看它并意识到我没有理由在这里调用 groupby 除了 groupby 使我的列保持在正确的方向之外)。我想我会 post 我的解决方案以防万一有人遇到这个问题。
for i in range(num_timeframes):
results = tdf.loc[tdf["Test #"] == i].mean()
results = pd.concat([results, tdf.loc[tdf["Test #"] == i].std()], axis = 1)
results = pd.concat([results, 2*tdf.loc[tdf["Test #"] == i].std()], axis = 1)
results = results.transpose()
results["Test #"] = i
new_df = pd.concat([new_df,results])
new_df.loc[new_df.shape[0]] = [None]*len(new_df.columns)
我所要做的就是转置我的结果,因为 df.mean() 出于某种原因翻转数据帧,这可能是我首先尝试使用 groupby 的原因。