熊猫均值函数返回所有NaN

时间:2020-03-30 13:57:44

标签: python pandas dataframe average nan

我有这个数据框:

df = [{'A1':10, 'A2':''}, {'A1':11,'A2':110}, {'A1':12,'A2':120}]

我想对不同的列求平均值,而忽略''(空字符串)值。

这是所需的输出

df_AVG = [{'A1':10, 'A2':'','avg':10}, {'A1':11,'A2':110,'avg': 60.5}, {'A1':12,'A2':120,'avg':66}]

我可以用以下代码做到这一点:

df['avg'] = df[['A1','A2']].mean(axis=1, numeric_only=True)

但是当我修改数据框时,它包含多个空白,例如

df = [{'A1':10, 'A2':''}, {'A1':'','A2':110}, {'A1':12,'A2':120}]

我运行相同的代码,输出是这个。所有“ avg”值均为NaN,包括以前有效的值:

df_AVG = [{'A1':10, 'A2':'','avg':NaN}, {'A1':11,'A2':110,'avg': NaN}, {'A1':12,'A2':120,'avg':NaN}]

您能告诉我这种方法有什么问题吗?谢谢!

2 个答案:

答案 0 :(得分:2)

当您使用numeric_only时,它将“丢弃”非数字列,因此在第二种情况下,由于它们都是字符串,因此将丢弃所有列。如果您仔细检查第一种情况的平均值,您会发现在第二和第三行中,由于110和120由于空字符串而被“丢弃”,因此只需要11和12。

如果需要,您可以这样做:

df['avg'] = df[['A1','A2']].replace('', np.nan).apply(lambda row: np.nanmean(row), axis=1)

将NaN替换为”,并获得忽略那些NaN的均值

答案 1 :(得分:2)

您应将列强制为数字类型。一个简单的方法可能是:

df['avg'] = pd.DataFrame({col : pd.to_numeric(df[col]) for col in df.columns}).mean(axis=1)

它给出了预期的结果:

   A1   A2    avg
0  10        10.0
1      110  110.0
2  12  120   66.0