我有一个下面给出的数据框示例。
hour minute value
0 0 10
0 5 20
0 10 30
0 15 50
0 20 10
0 25 55
1 0 55
1 5 50
1 10 10
1 15 20
1 20 30
1 25 40
1 30 50
....像这样每天一小时。我想采取每小时的平均值,每小时和每个最小值的多次,每个小时的实际值和最小值作为两个新列。所以最终的数据框如下所示。
所以0小时& 0分钟,平均值是平均值(10,55)& STDEV(10,55) 0小时和0分钟的新列的值将是平均值(10,55)* 10& STDEV(10,55)* 10 并且1小时0分钟的新列值将是 平均值(10,55)* 55& STDEV(10,55)* 55 同样需要迭代所有小时和分钟并聚合
hour minute value mean*value stdev*value
0 0 10 325 318
0 5 20 700 424
1 0 55 1787 1750
1 5 50 1750 1060
目前,我正在逐步对行进行迭代,然后按分钟进行迭代,并计算为每个行添加值。
for hour in df.hour:
for minute in df.minute:
trim_df = df.loc[(df[hour] == hour) & (df[minute] == minute)]
mean = trim_df [value].mean()
stdev = trim_df [value].std()
for index,row in trim_df.iterrows():
df.at[index, "mean*value"] = row["value"]*mean
df.at[index, "stdev*value"] = row["value"]*stdev
我的方法花了很多时间我试图使用pandas group by feature但不能转换这个逻辑。
答案 0 :(得分:2)
您可以使用df.groupby(...).transform('mean')
返回包含每组平均值的系列:
import pandas as pdf
df = pd.DataFrame(columns = ['hour', 'minute', 'value'], data =
[[ 0, 0, 10],
[0, 5, 20],
[0, 10, 30],
[ 0, 15, 50],
[0, 20, 10],
[0, 25, 55],
[1, 0, 55],
[1, 5, 50],
[1, 10, 10],
[1, 15, 20],
[1, 20, 30],
[1, 25, 40],
[1, 30, 50]])
df['mean_value'] = df.groupby(['minute'])['value'].transform('mean')*df.value
df
=> hour minute value mean_value
0 0 0 10 325.0
1 0 5 20 700.0
2 0 10 30 600.0
3 0 15 50 1750.0
4 0 20 10 200.0
5 0 25 55 2612.5
6 1 0 55 1787.5
7 1 5 50 1750.0
8 1 10 10 200.0
9 1 15 20 700.0
10 1 20 30 600.0
11 1 25 40 1900.0
12 1 30 50 2500.0
使用.transform('std')
做同样的事情来获得标准差系列。