How can I calculate all column's mean to ONLY rows that aren't equal to zero and append a new row at the bottom with the averages with only one line of code? It doesn't have to be one line, but I'm wondering why this doesn't work?
The code below ignores the (df.bar != 0) piece
df = df.append(df[(df.bar != 0)].mean(numeric_only=True), ignore_index=True)
Example df:
foo bar total
0 foo1 bar1 293.09
1 foo2 0 0
2 foo3 bar3 342.3
Current Result:
0 foo bar total
1 foo1 bar1 293.09
2 foo2 0 0
3 foo3 bar3 342.3
4 211.796
Desired Result:
0 foo bar total
1 foo1 bar1 293.09
2 foo2 0 0
3 foo3 bar3 342.3
4 317.695
As John Galt commented need '0'
because 0
is string:
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
If need remove NaN
s in last row only use reindex
with parameter 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
Another solution - 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
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments