具有缺失值的列子集的行方式平均值

scr*_*lex 39 python dataframe pandas

我有一个'DataFrame`偶尔有缺失值,看起来像这样:

          Monday         Tuesday         Wednesday 
      ================================================
Mike        42             NaN               12
Jenna       NaN            NaN               15
Jon         21              4                 1
Run Code Online (Sandbox Code Playgroud)

我想新添加column到我的数据帧在那里我会计算所有的平均值columns为每row.

意思,因为Mike,我需要 (df['Monday'] + df['Wednesday'])/2,但因为Jenna,我只是使用df['Wednesday amt.']/1

有没有人知道解决由于缺失值导致的这种变化并计算平均值的最佳方法?

Ste*_*fan 92

你可以简单地说:

df['avg'] = df.mean(axis=1)

       Monday  Tuesday  Wednesday        avg
Mike       42      NaN         12  27.000000
Jenna     NaN      NaN         15  15.000000
Jon        21        4          1   8.666667
Run Code Online (Sandbox Code Playgroud)

因为.mean()默认情况下忽略缺失值:请参阅docs.

要选择子集,您可以:

df['avg'] = df[['Monday', 'Tuesday']].mean(axis=1)

       Monday  Tuesday  Wednesday   avg
Mike       42      NaN         12  42.0
Jenna     NaN      NaN         15   NaN
Jon        21        4          1  12.5
Run Code Online (Sandbox Code Playgroud)


Ami*_*r F 7

替代方案 - 使用 iloc(也可以在此处使用 loc):

df['avg'] = df.iloc[:,0:2].mean(axis=1)
Run Code Online (Sandbox Code Playgroud)


Lar*_*zzo 7

复活这个问题是因为所有以前的答案当前都会打印警告。

在大多数情况下,使用assign()

df = df.assign(avg=df.mean(axis=1))
Run Code Online (Sandbox Code Playgroud)

对于特定的列,可以按名称输入:

df = df.assign(avg=df.loc[:, ["Monday", "Tuesday", "Wednesday"]].mean(axis=1))
Run Code Online (Sandbox Code Playgroud)

或者按索引,使用比最后一个所需索引多一个的索引,因为它不包含在内:

df = df.assign(avg=df.iloc[:,0:3]].mean(axis=1))
Run Code Online (Sandbox Code Playgroud)