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