【发布时间】:2019-05-09 16:14:14
【问题描述】:
我有一个大型数据框,我在其中计算条件均值。我需要将 NaN 更改为该城市的最后一个有效值。
我试过 df['Mean3big'].fillna(method='ffill', inplace=True) 但后来我得到了错误的值,因为它没有考虑城市。
df = pd.DataFrame([["Gothenburg", "2018", 1.5, 2.3, 107],
["Gothenburg", 2018, 1.3, 3.3, 10],
["Gothenburg", 2018, 2.2, 2.3, 20],
["Gothenburg", 2018, 1.5, 2.1, 30],
["Gothenburg", 2018, 2.5, 2.3, 20],
["Malmo", 2018, 1.6, 2.3, 10],
["Gothenburg", 2018, 1.9, 2.8, 10],
["Malmo", 2018, 0.7, 4.3, 30],
["Gothenburg", 2018, 1.7, 3.2, 40],
["Malmo", 2018, 1.0, 3.3, 40],
["Gothenburg", 2018, 3.7, 2.3, 10],
["Malmo", 2018, 1.0, 2.9, 112],
["Gothenburg", 2018, 2.7, 2.3, 20],
["Gothenburg", 2019, 1.3, 3.3, 10],
["Gothenburg", 2019, 1.2, 2.3, 20],
["Gothenburg", 2019, 1.6, 2.1, 10],
["Gothenburg", 2019, 1.8, 2.3, 10],
["Malmo", 2019, 1.6, 1.3, 20],
["Gothenburg", 2019, 1.9, 2.8, 30]])
df.columns = ['City', 'Year', 'Val1', 'Val2', 'Val3']
df["Mean3big"] = round(df.groupby(['City', "Year"])['Val3'].transform(lambda x: x.expanding().mean().shift()).where(df['Val1'] > 1.6), 2)
我的结果:
City Year Val1 Val2 Val3 Mean3big
0 Gothenburg 2018 1.5 2.3 107 NaN
1 Gothenburg 2018 1.3 3.3 10 NaN
2 Gothenburg 2018 2.2 2.3 20 10.00
3 Gothenburg 2018 1.5 2.1 30 NaN
4 Gothenburg 2018 2.5 2.3 20 20.00
5 Malmo 2018 1.6 2.3 10 NaN
6 Gothenburg 2018 1.9 2.8 10 20.00
7 Malmo 2018 0.7 4.3 30 NaN
8 Gothenburg 2018 1.7 3.2 40 18.00
9 Malmo 2018 1.0 3.3 40 NaN
10 Gothenburg 2018 3.7 2.3 10 21.67
11 Malmo 2018 1.0 2.9 112 NaN
12 Gothenburg 2018 2.7 2.3 20 20.00
13 Gothenburg 2019 1.3 3.3 10 NaN
14 Gothenburg 2019 1.2 2.3 20 NaN
15 Gothenburg 2019 1.6 2.1 10 NaN
16 Gothenburg 2019 1.8 2.3 10 13.33
17 Malmo 2019 1.6 1.3 20 NaN
18 Gothenburg 2019 1.9 2.8 30 12.50
我希望 Mean3big 第 3 行给出城市“哥德堡”= 10 的最后一个有效值。第 0 行和第 1 行可以使用 NaN,因为我没有先前的有效值。
第 7 行应为 20,这是“Malmo”的最后一个有效值。第 5 行对 Nan 没问题,因为没有先前的有效值,依此类推...
【问题讨论】:
-
为什么第 7 行应该是 20?那时没有以前的 Malmo 条目具有有效的 Mean3big,还是我遗漏了什么?
标签: python