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

26

我有一个包含100行,10列的pandas数据框(实际数据很大)。我还有一个行索引列表,其中包含要考虑计算平均值的行。我想在第2、5、6、7和8列上计算平均值。我们能否使用一些数据框对象函数来完成这个任务?

我的想法是用for循环,获取每个row_index元素的行值并持续计算平均值。我们是否有一些直接的函数可以向其中传递row_list、column_list和axis参数,例如df.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

你能否发布一些你想要做的事情的小版本以及你想要的输出结果? - Ami Tavory
看,现在。抱歉编辑不好。 - impossible
2个回答

23
要选择数据框的行,可以使用 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

要选择仅第3行和第5行,可以执行以下操作:

df.iloc[[2,4]]

它返回:

   a  b  c
5  1  2  3
7  1  2  3

如果您想仅选择B列和C列,则可以使用以下命令:

如果你之后想要选择只有 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/matrix中。我有L1、L2、L3、L4...LX列表,告诉我需要C[1,2,3]列的哪个索引的平均值。例如:L1 = [0,2,3],意味着我需要行0、2、3的平均值,并将其存储在新df/matrix的第一行中。然后L2 = [1,4],我将再次计算平均值并将其存储在新df/matrix的第二行中。类似地,直到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

感谢Skirrebattie的回答。那正是我正在使用的,你能否回复下面的评论? - impossible
我的实际问题是,我必须将这些均值存储在另一个df/matrix中。我有L1、L2、L3、L4...LX列表,告诉我需要哪些列C[1, 2, 3]的均值的索引。例如:L1=[0,2,3],意味着我需要计算行0,2,3的平均值,并将其存储在new df/matrix的第一行中。然后,L2=[1,4],我将再次计算平均值并将其存储在new df/matrix的第二行中。同样,直到LX,我希望新的dfX行len(C)列L1..LX的列将保持不变。你能帮我吗? - impossible
谢谢您的快速回复。实际上,我通过使用您或mfitzp的答案之一使其工作。接受您的答案 :) - impossible

8
您可以通过将索引列表传递给.iloc从DataFrame中选择特定列,例如:
df.iloc[:, [2,5,6,7,8]]

将返回一个数据框,其中包含这些编号的列(注意:这里采用0索引,因此2表示第3列)。

要对该列进行均值下降,您可以使用:

# 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

谢谢mfitzp。你的答案很有用。但我的实际问题是,我必须将这些均值存储在另一个df/矩阵中。我有L1、L2、L3、L4...LX列表,告诉我需要哪些列C[1, 2, 3]的均值的索引。例如:L1 = [0, 2, 3],意味着我需要行0,2,3的平均值,并将其存储在new df/matrix的第一行中。然后L2 = [1,4],我将再次计算平均值并将其存储在new df/matrix的第二行中。同样,直到LX,我希望新的df有X行len(C)列L1..LX的列将保持不变。你能帮我吗?感谢你的回答! - impossible
1
@ArewegoodQ 我已经更新了你问题的第二部分的答案。 - mfitzp
非常感谢您的回答mfitzp。我已经成功实现了使用问题中的任何一个答案。但是很遗憾我不能接受两个答案 :( - impossible

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接