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



我做错了什么?我有一个数据帧,在其中我添加了两个新列——第一个列通过将每列中等于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函数来按位置获取列,因为添加新列是必要的,使用DataFrame.whereavg列的位置+1替换为缺失值:

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将返回布尔值矩阵,因为它是一个比较表达式。取这些值的平均值将不会给出原始值的平均,因为这样的矩阵中的最大值无论如何都将是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"]     

最新更新