Pandas - 通过聚合非空值替换NaN

时间:2017-07-28 05:41:20

标签: python pandas dataframe nan

假设我有一个带有一些NaN的DataFrame -

import pandas as pd
l = [{'C1':-6,'C3':2},
     {'C2':-6,'C3':3},
     {'C1':-6.3,'C2':8,'C3':9},
     {'C2':-7}]
df1 = pd.DataFrame(l,
    index=['R1','R2','R3','R4'])
print(df1)

     C1   C2   C3
R1 -6.0  NaN  2.0
R2  NaN -6.0  3.0
R3 -6.3  8.0  9.0
R4  NaN -7.0  NaN

问题 - 如果任何行单元格中存在任何NaN值,则必须将其替换为同一行中的非空值的聚合。 例如,在第一行中,(R1,C2)的值应为=( - 6 + 2)/ 2 = -2

预期产出 -

     C1   C2   C3
R1 -6.0 -4.0  2.0
R2 -1.5 -6.0  3.0
R3 -6.3  8.0  9.0
R4 -7.0 -7.0 -7.0

2 个答案:

答案 0 :(得分:3)

applyaxis=1一起用于按行处理:

df1 = df1.apply(lambda x: x.fillna(x.mean()), axis=1)
print(df1)

     C1   C2   C3
R1 -6.0 -2.0  2.0
R2 -1.5 -6.0  3.0
R3 -6.3  8.0  9.0
R4 -7.0 -7.0 -7.0

也有效:

df1 = df1.T.fillna(df1.mean(1)).T
print(df1)
     C1   C2   C3
R1 -6.0 -2.0  2.0
R2 -1.5 -6.0  3.0
R3 -6.3  8.0  9.0
R4 -7.0 -7.0 -7.0

由于:

df1 = df1.fillna(df1.mean(1), axis=1)
print(df1)
  

NotImplementedError:目前只能逐列填充dict / Series

答案 1 :(得分:0)

你可以这样做。转置,然后执行fillna()然后再转置它。

>>> df1 = df1.T.fillna(df1.mean(axis=1)).T
>>> print(df1)
     C1   C2   C3
R1 -6.0 -4.0  2.0
R2 -1.5 -6.0  3.0
R3 -6.3  8.0  9.0
R4 -7.0 -7.0 -7.0