计算数据框中选定列的选定行的平均值

2024-04-16 06:35:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有100行10列的数据(实际数据非常大)。我还有一个row_索引列表,它包含哪些行被认为是平均值。我想计算第2、5、6、7和8列的平均值。我们可以用dataframe对象的函数来实现吗

我知道的是做一个for循环,为row_索引中的每个元素获取行的值,然后继续执行mean。我们是否有一些直接函数,可以为exdf.meanAdvance(row_list,column_list,axis=0)传递行列表、列列表和轴

我已经看过DataFrame.mean(),但我想这没什么帮助

  a b c d q 
0 1 2 3 0 5
1 1 2 3 4 5
2 1 1 1 6 1
3 1 0 0 0 0

我想要每个a, b, d列的0, 2, 3行的平均值

  a b d
0 1 1 2

Tags: 数据对象函数元素dataframe列表forcolumn
2条回答

要选择数据帧的行,可以使用iloc,然后可以使用方括号选择所需的列

例如:

 df = pd.DataFrame(data=[[1,2,3]]*5, index=range(3, 8), columns = ['a','b','c'])

提供以下数据帧:

   a  b  c
3  1  2  3
4  1  2  3
5  1  2  3
6  1  2  3
7  1  2  3

要仅选择三维和第五行,可以执行以下操作:

df.iloc[[2,4]]

返回:

   a  b  c
5  1  2  3
7  1  2  3

如果您想仅选择列b和c,则使用以下命令:

df[['b', 'c']].iloc[[2,4]]

这将产生:

   b  c
5  2  3
7  2  3

然后,要获得数据帧子集的平均值,可以使用df.mean函数。如果需要列的平均值,可以指定axis=0;如果需要行的平均值,可以指定axis=1

因此:

df[['b', 'c']].iloc[[2,4]].mean(axis=0)

返回:

b    2
c    3

正如我们从输入数据帧中所期望的那样

对于您的代码,您可以执行以下操作:

 df[column_list].iloc[row_index_list].mean(axis=0)

评论后编辑: 评论中的新问题: 我必须将这些方法存储在另一个df/矩阵中。我有L1,L2,L3,L4…LX列表,它告诉我C[1,2,3]列需要的索引的平均值。对于ex:L1=[0,2,3],意味着我需要行0,2,3的平均值,并将其存储在新df/矩阵的第一行中。然后L2=[1,4],我将再次计算平均值,并将其存储在新df/矩阵的第二行。类似地,直到LX,我希望新的df有X行和len(C)列。L1..LX的列将保持不变。你能帮我做这个吗

答复:

如果我理解正确的话,下面的代码应该可以做到这一点(与上面的df相同,作为我使用的'a'和'b'列):

首先在所有行列表上循环,将所有平均值收集为pd.series,然后在axis=1上连接生成的系列列表,然后进行转置以获得正确的格式

dfs = list()
for l in L:
    dfs.append(df[['a', 'b']].iloc[l].mean(axis=0))

mean_matrix = pd.concat(dfs, axis=1).T

您可以通过将索引列表传递给.iloc,从数据帧中选择特定列,例如:

df.iloc[:, [2,5,6,7,8]]

将返回包含这些编号列的数据帧(注意:这使用基于0的索引,因此2表示第三列。)

要计算该列的平均值,可以使用:

# Mean along 0 (vertical) axis: return mean for specified columns, calculated across all rows
df.iloc[:, [2,5,6,7,8]].mean(axis=0) 

要对该列取平均值,您可以使用:

# Mean along 1 (horizontal) axis: return mean for each row, calculated across specified columns
df.iloc[:, [2,5,6,7,8]].mean(axis=1)

还可以为两个轴提供特定索引,以返回表的子集:

df.iloc[[1,2,3,4], [2,5,6,7,8]]

对于您的具体示例,您将执行以下操作:

import pandas as pd
import numpy as np

df = pd.DataFrame( 
np.array([[1,2,3,0,5],[1,2,3,4,5],[1,1,1,6,1],[1,0,0,0,0]]),
columns=["a","b","c","d","q"],
index = [0,1,2,3]
)

#I want mean of 0, 2, 3 rows for each a, b, d columns
#. a b d
#0 1 1 2

df.iloc[ [0,2,3], [0,1,3] ].mean(axis=0)

哪些产出:

a    1.0
b    1.0
d    2.0
dtype: float64

或者,要通过列名访问,请首先选择以下选项:

df[ ['a','b','d'] ].iloc[ [0,1,3] ].mean(axis=0)

要回答问题的第二部分(来自评论),可以使用pd.concat将多个数据帧连接在一起。在列表中累积帧,然后一次性传递到pd.concat会更快,例如

dfs = []
for ix in idxs:
    dfm = df.iloc[ [0,2,3], ix ].mean(axis=0)
    dfs.append(dfm)

dfm_summary = pd.concat(dfs, axis=1) # Stack horizontally

相关问题 更多 >