2017-08-30 44 views
1

我如何计算所有列的平均值为只有不等于零的行,并在底部附加一行并且只有一行代码的平均值?它不一定是一条线,但我想知道为什么这不起作用?如何计算pandas数据框的已过滤行的平均值,并将原始数据框的所有列的附加方法追加到哪里?

下面的代码忽略了(!df.bar = 0)片

df = df.append(df[(df.bar != 0)].mean(numeric_only=True), ignore_index=True) 

例DF:

foo  bar  total 
0 foo1 bar1 293.09 
1 foo2 0  0 
2 foo3 bar3 342.3 

当前结果:

0 foo  bar  total 
1 foo1 bar1 293.09 
2 foo2 0  0 
3 foo3 bar3 342.3 
4     211.796 

所需的结果:

0 foo  bar  total 
1 foo1 bar1 293.09 
2 foo2 0  0 
3 foo3 bar3 342.3 
4     317.695 
+0

需要'!='in替代'<>'因为python。 – jezrael

+0

谢谢,修正了这个问题。 – Mike

+0

应该用''df.bar!='0''加引号,因为它是一个字符串。即'df.append(df [(df.bar!='0')]。mean(numeric_only = True),ignore_index = True)' – Zero

回答

4

正如约翰·高尔特评论需要'0'因为0是字符串:

df = df.append(df[(df.bar != '0')].mean(numeric_only=True), ignore_index=True) 
print (df) 
    foo bar total 
0 foo1 bar1 293.090 
1 foo2  0 0.000 
2 foo3 bar3 342.300 
3 NaN NaN 317.695 

如果需要最后一排删除NaN唯一使用reindex与参数fill_value

s = df[(df.bar != '0')].mean(numeric_only=True).reindex(df.columns, fill_value='') 
df = df.append(s, ignore_index=True) 
print (df) 
    foo bar total 
0 foo1 bar1 293.090 
1 foo2  0 0.000 
2 foo3 bar3 342.300 
3    317.695 

另一种解决方案 - setting with enlargement

df.loc[len(df.index)] = s 
print (df) 
    foo bar total 
0 foo1 bar1 293.090 
1 foo2  0 0.000 
2 foo3 bar3 342.300 
3    317.695 
+0

可选'.fillna('')'结尾处的Op输出 –

+0

是它,谢谢你! – Mike

相关问题