我有pandas df,比方说,100行,10列,(实际数据很大)。我还有row_index列表,其中包含哪些行被认为取平均值。我想在列2,5,6,7和8上计算平均值。我们可以使用dataframe对象的某些函数吗?
我所知道的是做一个for循环,获取row_index中每个元素的行值并继续做意思。我们是否有一些直接函数,我们可以为ex df.meanAdvance(row_list,column_list,axis=0)
传递row_list,column_list和axis?
我见过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
我希望每个0, 2, 3
列
a, b, d
行的平均值
a b d
0 1 1 2
答案 0 :(得分:6)
要选择数据帧的行,您可以使用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]。例如:L1 = [0,2,3],意味着我需要行0,2,3的平均值并将其存储在新的df /矩阵的第一行中。那么L2 = [1,4]我将再次计算平均值并将其存储在新df /矩阵的第二行中。同样地,直到LX,我希望新的df具有X行和len(C)列。 L1..LX的列将保持不变。你能帮我解决这个问题吗?
答案:
如果我理解正确,下面的代码应该可以解决问题(与上面的df相同,因为我选择'a'和'b'的列:
首先遍历所有行列表,将所有方法集合为pd.series,然后在轴= 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
答案 1 :(得分:3)
您可以通过将索引列表传递给.iloc
来从DataFrame中选择特定列,例如:
df.iloc[:, [2,5,6,7,8]]
将返回包含这些编号列的DataFrame(注意:这使用基于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
一起加入多个DataFrame。在列表中累积帧然后一次性传递给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