Python 特定列的平均值并将其存储在新列中

Python 特定列的平均值并将其存储在新列中,python,pandas,multiple-columns,mean,Python,Pandas,Multiple Columns,Mean,我做错了什么?我有一个dataframe,其中我添加了两个新列,第一个列通过将每列中所有等于1的值添加到右边来创建计数。那部分很好用。代码的下一部分应该给出右边所有不等于0的值的平均值。出于某种原因,它还考虑了左侧的值。这是代码。谢谢你的帮助 我已经尝试了我的代码以及下面的两种解决方案,但仍然得到了错误的平均值。这是一个带有随机数据帧的简化版本,以及所有三个版本的代码。我删除了左边的值,但仍然存在平均值错误的问题。也许这会有帮助 第1版: df = pd.DataFrame(np.random.

我做错了什么?我有一个dataframe,其中我添加了两个新列,第一个列通过将每列中所有等于1的值添加到右边来创建计数。那部分很好用。代码的下一部分应该给出右边所有不等于0的值的平均值。出于某种原因,它还考虑了左侧的值。这是代码。谢谢你的帮助

我已经尝试了我的代码以及下面的两种解决方案,但仍然得到了错误的平均值。这是一个带有随机数据帧的简化版本,以及所有三个版本的代码。我删除了左边的值,但仍然存在平均值错误的问题。也许这会有帮助

第1版:

df = pd.DataFrame(np.random.randint(0,3,size=(10, 10)), columns=list('ABCDEFGHIJ'))

idx_last = len(df.columns)
df.insert(loc=0, column='new', value=df[df[0:(idx_last+1)]==1].sum(axis=1))

idx_last = len(df.columns)
df.insert(loc=1, column='avg', value=df[df[0:(idx_last+1)]!=0].mean(axis=1))

df
第2版:

df = pd.DataFrame(np.random.randint(0,3,size=(10, 10)), columns=list('ABCDEFGHIJ'))

df.insert(loc=0, column='new', value=(df.iloc[:, 0:]==1).sum(axis=1))
df.insert(loc=1, column='avg', value=(df.iloc[:, 1:]!=0).mean(axis=1))

df
第3版:

df = pd.DataFrame(np.random.randint(0,3,size=(10, 10)), columns=list('ABCDEFGHIJ'))

idx_last = len(df.columns)
loc_value=0
df.insert(loc=loc_value, column='new', value=df[df[loc_value:(idx_last+1)]==1].sum(axis=1))

idx_last = len(df.columns)
loc_value=1
df.insert(loc=loc_value, column='avg', value=df[df[loc_value: (idx_last+1)]!=0].sum(axis=1))

df
我相信您需要按位置获取列的函数,因为需要添加新列,请使用位置+1 for
avg
column with将不匹配的值替换为缺少的值:

np.random.seed(123)
df = pd.DataFrame(np.random.randint(0,3,size=(10, 5)), columns=list('ABCDE'))

df.insert(loc=0, column='new', value=(df.iloc[:, 0:]==1).sum(axis=1))
df.insert(loc=1, column='avg', value=(df.iloc[:, 1:].where(df.iloc[:, 1:]!=0)).mean(axis=1))
print (df)
   new       avg  A  B  C  D  E
0    1  1.750000  2  1  2  2  0
1    2  1.600000  2  2  1  2  1
2    2  1.500000  2  1  0  1  2
3    2  1.333333  1  0  2  0  1
4    1  1.500000  2  1  0  0  0
5    1  1.666667  0  1  2  0  2
6    2  1.000000  0  0  1  0  1
7    1  1.500000  0  0  0  2  1
8    2  1.600000  1  2  2  2  1
9    1  1.500000  0  0  2  1  0
或者在
df1
变量中使用helper
DataFrame

np.random.seed(123)
df = pd.DataFrame(np.random.randint(0,3,size=(10, 5)), columns=list('ABCDE'))

df1 = df.copy()
df.insert(loc=0, column='new', value=(df1==1).sum(axis=1))
df.insert(loc=1, column='avg', value=df1.where(df1!=0).mean(axis=1))
print (df)
   new       avg  A  B  C  D  E
0    1  1.750000  2  1  2  2  0
1    2  1.600000  2  2  1  2  1
2    2  1.500000  2  1  0  1  2
3    2  1.333333  1  0  2  0  1
4    1  1.500000  2  1  0  0  0
5    1  1.666667  0  1  2  0  2
6    2  1.000000  0  0  1  0  1
7    1  1.500000  0  0  0  2  1
8    2  1.600000  1  2  2  2  1
9    1  1.500000  0  0  2  1  0
我相信您需要按位置获取列的函数,因为需要添加新列,请使用位置+1 for
avg
column with将不匹配的值替换为缺少的值:

np.random.seed(123)
df = pd.DataFrame(np.random.randint(0,3,size=(10, 5)), columns=list('ABCDE'))

df.insert(loc=0, column='new', value=(df.iloc[:, 0:]==1).sum(axis=1))
df.insert(loc=1, column='avg', value=(df.iloc[:, 1:].where(df.iloc[:, 1:]!=0)).mean(axis=1))
print (df)
   new       avg  A  B  C  D  E
0    1  1.750000  2  1  2  2  0
1    2  1.600000  2  2  1  2  1
2    2  1.500000  2  1  0  1  2
3    2  1.333333  1  0  2  0  1
4    1  1.500000  2  1  0  0  0
5    1  1.666667  0  1  2  0  2
6    2  1.000000  0  0  1  0  1
7    1  1.500000  0  0  0  2  1
8    2  1.600000  1  2  2  2  1
9    1  1.500000  0  0  2  1  0
或者在
df1
变量中使用helper
DataFrame

np.random.seed(123)
df = pd.DataFrame(np.random.randint(0,3,size=(10, 5)), columns=list('ABCDE'))

df1 = df.copy()
df.insert(loc=0, column='new', value=(df1==1).sum(axis=1))
df.insert(loc=1, column='avg', value=df1.where(df1!=0).mean(axis=1))
print (df)
   new       avg  A  B  C  D  E
0    1  1.750000  2  1  2  2  0
1    2  1.600000  2  2  1  2  1
2    2  1.500000  2  1  0  1  2
3    2  1.333333  1  0  2  0  1
4    1  1.500000  2  1  0  0  0
5    1  1.666667  0  1  2  0  2
6    2  1.000000  0  0  1  0  1
7    1  1.500000  0  0  0  2  1
8    2  1.600000  1  2  2  2  1
9    1  1.500000  0  0  2  1  0

问题出现在表达式中,
(df.iloc[:,1:::!=0).mean(axis=1)
。这是因为
df.iloc[:,1:]=0将返回布尔矩阵,因为它是一个比较表达式。取这些值的平均值不会给出原始值的平均值,因为这样的矩阵中的最大值无论如何都是1。
因此,以下内容可以完成这项工作(请注意索引)


问题出现在表达式中,
(df.iloc[:,1:::!=0).mean(axis=1)
。这是因为
df.iloc[:,1:]=0将返回布尔矩阵,因为它是一个比较表达式。取这些值的平均值不会给出原始值的平均值,因为这样的矩阵中的最大值无论如何都是1。
因此,以下内容可以完成这项工作(请注意索引)


很抱歉,现在我知道得更多了,很抱歉,现在我知道我不能让它工作。我已经更新并简化了这个问题。也许你会有一些见解。@rwa-你能更具体一点吗?如果使用
np.random.seed(123)
df=pd.DataFrame(np.random.randint(0,3,size=(10,5)),columns=list('ABCDE'))
预期的输出是什么?好吧,我试过了,用上面的确切数据框,我预计avg列是1.75 1.60 1.50 1.33 1.50 1.67 1.00 1.50 1.60 1.50,这将是第一行(2+1+2)的平均值=7和7/4=1.75我无法让它工作。我已经更新并简化了这个问题。也许你会有一些见解。@rwa-你能更具体一点吗?如果使用
np.random.seed(123)
df=pd.DataFrame(np.random.randint(0,3,size=(10,5)),columns=list('ABCDE'))
预期的输出是什么?好吧,我试过了,用上面的确切数据框,我预计avg列是1.75 1.60 1.50 1.33 1.50 1.67 1.00 1.50 1.60 1.50,这将是第一行(2+1+2)的平均值=7和7/4=1.75谢谢你的详细解释。这真的帮助我明白我做错了什么。谢谢你的详细解释。这真的帮助我明白我做错了什么。