Python 创建一列,该列是数据框中多个列的平均值

Python 创建一列,该列是数据框中多个列的平均值,python,pandas,dataframe,multiple-columns,mean,Python,Pandas,Dataframe,Multiple Columns,Mean,因此,我研究了多种可能的解决方案,但似乎都不起作用 基本上,我想在我的数据框中创建一个新列,它是多个其他列的平均值。我希望此平均值排除NaN值,但即使行中有NaN值,也要计算平均值 我有一个看起来像这样的数据帧(但实际上是Q222-229): 我想创建一个列,它是Q1、Q2、Q3、Q4、Q5的平均值,即: ID Q1 Q2 Q3 Q4 Q5 avg_age 1 4 NaN NaN NaN NaN 4 2 5 7 8 NaN N

因此,我研究了多种可能的解决方案,但似乎都不起作用

基本上,我想在我的数据框中创建一个新列,它是多个其他列的平均值。我希望此平均值排除NaN值,但即使行中有NaN值,也要计算平均值

我有一个看起来像这样的数据帧(但实际上是Q222-229):

我想创建一个列,它是Q1、Q2、Q3、Q4、Q5的平均值,即:

ID   Q1   Q2   Q3   Q4   Q5   avg_age
1    4    NaN  NaN  NaN  NaN  4
2    5    7    8    NaN  NaN  5.5
3    7    1    2    NaN  NaN  3.5
4    2    2    3    4    1    2
5    1    3    NaN  NaN  NaN  2
(忽略值)

但是,我尝试过的每个方法都会在avg_age列中返回NaN值,这让我认为,当忽略NaN值时,pandas会忽略整行。但我不希望发生这种情况,而是希望返回的平均值忽略NaN值

以下是我迄今为止所尝试的:

1.
    avg_age = s.loc[: , "Q222":"Q229"]
    avg_age = avg_age.mean(axis=1)
    s = pd.concat([s, avg_age], axis=1)

2.
    s['avg_age'] = s[['Q222', 'Q223', 'Q224', 'Q225', 'Q226', 'Q227', 'Q228', 'Q229']].mean(axis=1)

3.

    avg_age = ['Q222', 'Q223', 'Q224', 'Q225', 'Q226', 'Q227', 'Q228', 'Q229']
    s.loc[:, 'avg_age'] = s[avg_age].mean(axis=1)
我不确定我最初对值进行编码的方式是否有问题,因此以下是我的代码供参考:

#改变年龄变量输入

s['Q222'] = s['Q222'].replace(['18-24', '25-34','35-44', '45-54','55-64', '65-74', '75 or older', "Don't know"],
                              ['2','3','4','5', '6', '7', '8', np.NaN])
s['Q223'] = s['Q223'].replace(['18-24', '25-34','35-44', '45-54','55-64', '65-74', '75 or older', "Don't know"],
                              ['2','3','4','5', '6', '7', '8', np.NaN])
s['Q224'] = s['Q224'].replace(['18-24', '25-34','35-44', '45-54','55-64', '65-74', '75 or older', "Don't know"],
                              ['2','3','4','5', '6', '7', '8', np.NaN])
s['Q225'] = s['Q225'].replace(['18-24', '25-34','35-44', '45-54','55-64', '65-74', '75 or older', "Don't know"],
                              ['2','3','4','5', '6', '7', '8', np.NaN])
s['Q226'] = s['Q226'].replace(['18-24', '25-34','35-44', '45-54','55-64', '65-74', '75 or older', "Don't know"],
                              ['2','3','4','5', '6', '7', '8', np.NaN])
s['Q227'] = s['Q227'].replace(['18-24', '25-34','35-44', '45-54','55-64', '65-74', '75 or older', "Don't know"],
                              ['2','3','4','5', '6', '7', '8', np.NaN])
s['Q228'] = s['Q228'].replace(['18-24', '25-34','35-44', '45-54','55-64', '65-74', '75 or older', "Don't know"],
                              ['2','3','4','5', '6', '7', '8', np.NaN])
s['Q229'] = s['Q229'].replace(['18-24', '25-34','35-44', '45-54','55-64', '65-74', '75 or older', "Don't know"],
                              ['2','3','4','5', '6', '7', '8', np.NaN])

s['Q222'] = s['Q222'].replace(['0-4', '05-11', '12-15', '16-17'], '1')
s['Q223'] = s['Q223'].replace(['0-4', '05-11', '12-15', '16-17'], '1')
s['Q224'] = s['Q224'].replace(['0-4', '05-11', '12-15', '16-17'], '1')
s['Q225'] = s['Q225'].replace(['0-4', '05-11', '12-15', '16-17'], '1')
s['Q226'] = s['Q226'].replace(['0-4', '05-11', '12-15', '16-17'], '1')
s['Q227'] = s['Q227'].replace(['0-4', '05-11', '12-15', '16-17'], '1')
s['Q228'] = s['Q228'].replace(['0-4', '05-11', '12-15', '16-17'], '1')
s['Q229'] = s['Q229'].replace(['0-4', '05-11', '12-15', '16-17'], '1')

提前感谢任何能够提供帮助的人

skipna=True

可以使用
列表理解
获得平均值,使用
mean()
获得平均值:

df['ave_age'] = df[[col for col in df.columns if 'Q' in col]].mean(axis = 1,skipna = True)

DataFrame.mean()
的默认行为应该满足您的要求

下面是一个示例,显示在列的子集上取平均值并将其放置在新创建的列中:

In[19]: tmp
Out[19]: 
   a  b    c
0  1  2  5.0
1  2  3  6.0
2  3  4  NaN

In[24]: tmp['mean'] = tmp[['b', 'c']].mean(axis=1)

In[25]: tmp
Out[25]: 
   a  b    c  mean
0  1  2  5.0   3.5
1  2  3  6.0   4.5
2  3  4  NaN   4.0
至于你的代码出了什么问题:

数据帧中没有数值(即2、3、4),而是字符串('2'、'3'和'4')。
DataFrame.mean()
函数将这些字符串视为NaN,因此所有平均值计算的结果都是NaN

尝试用数字填充你的框架,如下所示:

 s['Q222'] = s['Q222'].replace(['18-24', '25-34','35-44', '45-54','55-64', '65-74', '75 or older', "Don't know"],
                          [2, 3, 4, 5, 6, 7, 8, np.NaN])

你可以使用:
df['avg_age']=df.iloc[:,1:].mean(axis=1)
,因为你不需要第一列的平均值(即除了第一列以外的所有列)。5.5是5、7和8的平均值吗?^^^^^你的一些平均值加起来不起来(或者我应该说“平均值”)。谢谢你,大卫。正如我在文章中所说的,忽略这些值,因为它们对于示例来说是任意的。谢谢!我还没有意识到我的replace函数正在把数字变成一个字符串(新手移动),所以谢谢你发现了这一点!
s['Q222'] = s['Q222'].replace(['18-24', '25-34','35-44', '45-54','55-64', '65-74', '75 or older', "Don't know"],
                         ['2','3','4','5', '6', '7', '8', np.NaN])
 s['Q222'] = s['Q222'].replace(['18-24', '25-34','35-44', '45-54','55-64', '65-74', '75 or older', "Don't know"],
                          [2, 3, 4, 5, 6, 7, 8, np.NaN])