特定列的平均值并将它们存储在新列中

average of specific columns and storing them in new column

我在这里做错了什么?我有一个数据框,我在其中添加两个新列,第一个通过将每列中的所有值添加到右侧等于 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

我相信您需要 DataFrame.iloc function for get columns by positions, because is added new column is necessary use position + 1 for avg column with DataFrame.where 来将不匹配的值替换为缺失值:

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 变量中使用助手 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 将 return 布尔矩阵,因为它是一个比较表达式。取这些值的平均值不会给出原始值的平均值,因为这种矩阵中的最大值无论如何都是 1。 因此,以下将完成这项工作(也请注意索引)

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).sum(axis=1))  #just keeping the count of non zeros
df["avg"]=df.iloc[:, 2:].sum(axis=1)/df["avg"]