如何对 pandas 中每 n 行的列值进行平均
How to average column values every n rows in pandas
你能告诉我如何对第一列中具有相同值的列值进行平均吗,如下所示?我想计算所有列的每 n 行。例如,站点值为“1”的 a1~a6 中所有值的平均值等于 3。(我的数据有很多列和行)
raw = {'site':['1','1','1','1','2','2','2','2'],
'a1':['1','2','3','4','5','6','7','8'],
'a2':['2','3','4','5','6','7','8','9'],
'a3':['2','3','4','5','6','7','8','9'],
'a4':['2','3','4','5','6','7','8','9'],
'a5':['2','3','4','5','6','7','8','9'],
'a6':['2','3','4','5','6','7','8','9']
}
df_tmp = pd.DataFrame(raw,columns = ['site','a1','a2','a3','a4','a5','a6'])
print(df_tmp)
谢谢
您可以使用:
df.mean(axis=0) # by each row
df.mean(axis=1) # by each column
您还可以执行以下操作:
df[[list_of_columns]].mean(axis=0)
df[[list_of_columns]].mean(axis=1)
您可以使用 df_tmp.iloc[row_index, col_index]
根据索引进行切片,或使用 df_tmp.loc[row_index, list_of_col_name]
使用 col_name 和行索引进行切片。
对于这种情况:
df_tmp.loc[0:3,['a1']]
returns
a1
0 1
1 2
2 3
3 4
df_tmp.iloc[0:3,1:5]
returns
a1 a2 a3 a4
0 1 2 2 2
1 2 3 3 3
2 3 4 4 4
要获得平均值,您基本上采用切片 df,然后调用 mean()
df_tmp.iloc[0:3,1:5].mean(axis=0)
将计算每个列的平均值。
a1 41.0
a2 78.0
a3 78.0
a4 78.0
要计算整个 sheet 的平均值,您可以这样做...
df_tmp.iloc[0:3,1:5].mean().mean()
returns 68.75
IIUC,DataFrame.melt
+ mean for each site with GroupBy.mean
# df_tmp = df_tmp.astype(int) # get correct result
df_tmp.melt('site').groupby('site')['value'].mean()
或:
# df_tmp = df_tmp.astype(int) # get correct result
df_tmp.set_index('site').stack().groupby(level=0).mean()
#df_tmp.set_index('site').stack().mean(level=0) # .mean(level=0) deprecated
输出
site
1 3.333333
2 7.333333
Name: value, dtype: float64
你能告诉我如何对第一列中具有相同值的列值进行平均吗,如下所示?我想计算所有列的每 n 行。例如,站点值为“1”的 a1~a6 中所有值的平均值等于 3。(我的数据有很多列和行)
raw = {'site':['1','1','1','1','2','2','2','2'],
'a1':['1','2','3','4','5','6','7','8'],
'a2':['2','3','4','5','6','7','8','9'],
'a3':['2','3','4','5','6','7','8','9'],
'a4':['2','3','4','5','6','7','8','9'],
'a5':['2','3','4','5','6','7','8','9'],
'a6':['2','3','4','5','6','7','8','9']
}
df_tmp = pd.DataFrame(raw,columns = ['site','a1','a2','a3','a4','a5','a6'])
print(df_tmp)
谢谢
您可以使用:
df.mean(axis=0) # by each row
df.mean(axis=1) # by each column
您还可以执行以下操作:
df[[list_of_columns]].mean(axis=0)
df[[list_of_columns]].mean(axis=1)
您可以使用 df_tmp.iloc[row_index, col_index]
根据索引进行切片,或使用 df_tmp.loc[row_index, list_of_col_name]
使用 col_name 和行索引进行切片。
对于这种情况:
df_tmp.loc[0:3,['a1']]
returns
a1
0 1
1 2
2 3
3 4
df_tmp.iloc[0:3,1:5]
returns
a1 a2 a3 a4
0 1 2 2 2
1 2 3 3 3
2 3 4 4 4
要获得平均值,您基本上采用切片 df,然后调用 mean()
df_tmp.iloc[0:3,1:5].mean(axis=0)
将计算每个列的平均值。
a1 41.0
a2 78.0
a3 78.0
a4 78.0
要计算整个 sheet 的平均值,您可以这样做...
df_tmp.iloc[0:3,1:5].mean().mean()
returns 68.75
IIUC,DataFrame.melt
+ mean for each site with GroupBy.mean
# df_tmp = df_tmp.astype(int) # get correct result
df_tmp.melt('site').groupby('site')['value'].mean()
或:
# df_tmp = df_tmp.astype(int) # get correct result
df_tmp.set_index('site').stack().groupby(level=0).mean()
#df_tmp.set_index('site').stack().mean(level=0) # .mean(level=0) deprecated
输出
site
1 3.333333
2 7.333333
Name: value, dtype: float64