我有这个数据框:
data = {'My_name':["abc","nc","there",""] , 'Val1':[44.20,22,None,44],'Val2':[50,20,40,72.2]}
df1 = pd.DataFrame(data)
My_name Val1 Val2
0 abc 44.2 50.0
1 nc 22.0 20.0
2 there NaN 40.0
3 44.0 72.2
4 there 28 60
我使用以下指令来获取基于My_name
的值的均值:
df2 = df1.where(pd.notnull(df1), None)
dcm = df2.groupby(['My_name']).agg([np.mean])
Exception: All objects passed were None
我尝试了各种测试并意识到错误是因为None
同时计算平均值。
我尝试使用以下代码来处理None
值:
df3 = df2.where(pd.notnull(df2['Val1']), None)
df4 = df3.where(pd.notnull(df3['Val2']), None)
dcm2 = df4.groupby(['My_name']).agg([np.mean])
但我仍然得到同样的错误。如何在不破坏NaN的情况下忽略NaN?
这样的事情也会做: 创建两个数据帧。一个没有None值(在Val1和Val2中),另一个没有None值。 例如:
df_sub:
My_name Val1 Val2
0 abc 44.2 50.0
1 nc 22.0 20.0
3 44.0 72.2
4 there 28 60
和df_sub2
:
My_name Val1 Val2
3 there Nan 40.0
df.dropna()
看起来是一个很好的功能,所以我做了:
df_sub = df2.dropna(subset=['Val1','Val2'])
我如何获得第二个数据帧?
答案 0 :(得分:3)
首先,我认为您不需要将NaN
值替换为None
,因为NaN
是缺失值的默认指标,mean
将忽略这些值。 1}}默认情况下,pandas(mean
的{{1}}参数默认为True。)
此外,用skipna
替换它将使对象的列dtype(不再是数字),并且并非所有操作都按预期工作。
因此,只需尝试对原始数据帧进行分组操作:
None
其次,要拆分数据框,您可以执行以下操作:
dcm = df1.groupby(['My_name']).agg([np.mean])
和另一个子集的In [26]: df1[pd.isnull(df1[['Val1', 'Val2']]).any(axis=1)]
Out[26]:
My_name Val1 Val2
2 there NaN 40
,但这确实相当于较短的df1[pd.notnull(df1[['Val1', 'Val2']]).all(axis=1)]