根据另一列的值在新数据框列中应用函数
Applying function in new dataframe column based on value from another column
我想在数据框中应用滚动均值函数。我在数据框中有多个类别(类别列中的 A 和 B),因此我必须计算每个类别的滚动平均值,这是我的问题。
数据框如下所示。 Rolling_Mean 列是预期结果。
Date Category Value Rolling_Mean
01.01.2017 A 12,30 NaN
02.01.2017 A 12,50 NaN
03.01.2017 A 12,90 12,57
04.01.2017 A 13,10 12,70
05.01.2017 A 12,90 12,74
06.01.2017 A 13,55 12,88
07.01.2017 A 13,12 12,91
01.01.2017 B 1,14 NaN
02.01.2017 B 1,52 NaN
03.01.2017 B 1,74 1,47
04.01.2017 B 2,12 1,63
05.01.2017 B 1,75 1,65
06.01.2017 B 1,69 1,66
07.01.2017 B 1,35 1,62
计算滚动平均值我使用 pandas 滚动:
df['Rolling_Mean'] = df['Value'].rolling (window=3).mean()
但我无法计算多个类别的滚动平均值。
我曾尝试使用 numpy.where(下图)来计算它,但它仅适用于一个类别,我正在寻找适用于 10 个类别的解决方案。
df['Rolling_Mean'] = np.where((df.Category == 'A'), df['Value'].rolling(window=3).mean(), 0)
你需要groupby
with rolling
, but output is Multiindex
, so need remove first level by reset_index
:
#replace values to floats or use parameter decimal=',' in read_csv
df['Value'] = df['Value'].str.replace(',','.').astype(float)
df['new'] = df.groupby('Category')['Value'].rolling(window=3, min_periods=3).mean()
.reset_index(level=0, drop=True)
print (df)
Date Category Value Rolling_Mean new
0 01.01.2017 A 12.30 NaN NaN
1 02.01.2017 A 12.50 NaN NaN
2 03.01.2017 A 12.90 12,57 12.566667
3 04.01.2017 A 13.10 12,70 12.833333
4 05.01.2017 A 12.90 12,74 12.966667
5 06.01.2017 A 13.55 12,88 13.183333
6 07.01.2017 A 13.12 12,91 13.190000
7 01.01.2017 B 1.14 NaN NaN
8 02.01.2017 B 1.52 NaN NaN
9 03.01.2017 B 1.74 1,47 1.466667
10 04.01.2017 B 2.12 1,63 1.793333
11 05.01.2017 B 1.75 1,65 1.870000
12 06.01.2017 B 1.69 1,66 1.853333
13 07.01.2017 B 1.35 1,62 1.596667
在 groupby
上下文中使用 rolling
Category
。要 return 与当前数据帧相同的索引,请使用 transform
并将 rolling
嵌入 lambda
df.assign(
Rolling_Mean=df.groupby('Category').Value.transform(
lambda x: x.rolling(3).mean()
)
)
Date Category Value Rolling_Mean
0 01.01.2017 A 12.30 NaN
1 02.01.2017 A 12.50 NaN
2 03.01.2017 A 12.90 12.566667
3 04.01.2017 A 13.10 12.833333
4 05.01.2017 A 12.90 12.966667
5 06.01.2017 A 13.55 13.183333
6 07.01.2017 A 13.12 13.190000
7 01.01.2017 B 1.14 NaN
8 02.01.2017 B 1.52 NaN
9 03.01.2017 B 1.74 1.466667
10 04.01.2017 B 2.12 1.793333
11 05.01.2017 B 1.75 1.870000
12 06.01.2017 B 1.69 1.853333
13 07.01.2017 B 1.35 1.596667
注:
如果您希望此结果持续存在,请确保将其分配给变量
df = df.assign(
Rolling_Mean=df.groupby('Category').Value.transform(
lambda x: x.rolling(3).mean()
)
)
我想在数据框中应用滚动均值函数。我在数据框中有多个类别(类别列中的 A 和 B),因此我必须计算每个类别的滚动平均值,这是我的问题。
数据框如下所示。 Rolling_Mean 列是预期结果。
Date Category Value Rolling_Mean
01.01.2017 A 12,30 NaN
02.01.2017 A 12,50 NaN
03.01.2017 A 12,90 12,57
04.01.2017 A 13,10 12,70
05.01.2017 A 12,90 12,74
06.01.2017 A 13,55 12,88
07.01.2017 A 13,12 12,91
01.01.2017 B 1,14 NaN
02.01.2017 B 1,52 NaN
03.01.2017 B 1,74 1,47
04.01.2017 B 2,12 1,63
05.01.2017 B 1,75 1,65
06.01.2017 B 1,69 1,66
07.01.2017 B 1,35 1,62
计算滚动平均值我使用 pandas 滚动:
df['Rolling_Mean'] = df['Value'].rolling (window=3).mean()
但我无法计算多个类别的滚动平均值。
我曾尝试使用 numpy.where(下图)来计算它,但它仅适用于一个类别,我正在寻找适用于 10 个类别的解决方案。
df['Rolling_Mean'] = np.where((df.Category == 'A'), df['Value'].rolling(window=3).mean(), 0)
你需要groupby
with rolling
, but output is Multiindex
, so need remove first level by reset_index
:
#replace values to floats or use parameter decimal=',' in read_csv
df['Value'] = df['Value'].str.replace(',','.').astype(float)
df['new'] = df.groupby('Category')['Value'].rolling(window=3, min_periods=3).mean()
.reset_index(level=0, drop=True)
print (df)
Date Category Value Rolling_Mean new
0 01.01.2017 A 12.30 NaN NaN
1 02.01.2017 A 12.50 NaN NaN
2 03.01.2017 A 12.90 12,57 12.566667
3 04.01.2017 A 13.10 12,70 12.833333
4 05.01.2017 A 12.90 12,74 12.966667
5 06.01.2017 A 13.55 12,88 13.183333
6 07.01.2017 A 13.12 12,91 13.190000
7 01.01.2017 B 1.14 NaN NaN
8 02.01.2017 B 1.52 NaN NaN
9 03.01.2017 B 1.74 1,47 1.466667
10 04.01.2017 B 2.12 1,63 1.793333
11 05.01.2017 B 1.75 1,65 1.870000
12 06.01.2017 B 1.69 1,66 1.853333
13 07.01.2017 B 1.35 1,62 1.596667
在 groupby
上下文中使用 rolling
Category
。要 return 与当前数据帧相同的索引,请使用 transform
并将 rolling
嵌入 lambda
df.assign(
Rolling_Mean=df.groupby('Category').Value.transform(
lambda x: x.rolling(3).mean()
)
)
Date Category Value Rolling_Mean
0 01.01.2017 A 12.30 NaN
1 02.01.2017 A 12.50 NaN
2 03.01.2017 A 12.90 12.566667
3 04.01.2017 A 13.10 12.833333
4 05.01.2017 A 12.90 12.966667
5 06.01.2017 A 13.55 13.183333
6 07.01.2017 A 13.12 13.190000
7 01.01.2017 B 1.14 NaN
8 02.01.2017 B 1.52 NaN
9 03.01.2017 B 1.74 1.466667
10 04.01.2017 B 2.12 1.793333
11 05.01.2017 B 1.75 1.870000
12 06.01.2017 B 1.69 1.853333
13 07.01.2017 B 1.35 1.596667
注:
如果您希望此结果持续存在,请确保将其分配给变量
df = df.assign(
Rolling_Mean=df.groupby('Category').Value.transform(
lambda x: x.rolling(3).mean()
)
)