我有一个带有风向的大型数据框,我想创建一个新列,将此信息映射到气象罗盘的 16 个部分,即。 N、NNE 等。我已经创建了一个包含键和值的字典,但是当我运行代码时,我的新列仅包含 NaN。这是我的数据和代码的示例。我不确定我到底哪里出了问题...感谢您的帮助。
time temperature windBearing windSpeed ozone pressure
0 2018-09-20 01:00:00 18.46 228 5.76 291.0 1014.5
1 2018-09-20 02:00:00 18.05 214 5.36 292.1 1014.5
2 2018-09-20 03:00:00 18.07 214 5.58 292.1 1014.3
3 2018-09-20 04:00:00 18.19 216 5.99 291.9 1013.9
4 2018-09-20 05:00:00 18.31 218 6.31 291.9 1013.5
角度词典:
compass = {
range(349, 11) : 'N',
range(11, 34) : 'NNE',
range(34, 56) : 'NE',
range(56, 79) : 'ENE',
range(79, 101) : 'E',
range(101, 124) : 'ESE',
range(124, 146) : 'SE',
range(146, 169) : 'SSE',
range(169, 191) : 'S',
range(191, 214) : 'SSW',
range(214, 236) : 'SW',
range(236, 259) : 'WSW',
range(259, 281) : 'w',
range(281, 304) : 'WNW',
range(304, 326) : 'NW',
range(326, 349) : 'NNW'
}
正在运行的代码:
df_met['compass'] = df_met['windBearing'].map(compass)
最佳答案
您的想法是正确的,但 map 在一对一的级别上工作,因此您无法匹配范围。
相反,让我们从您的罗盘字典创建一个新的数据框,并将值合并到您的数据框中。
df_dict = {}
for k,v in compass.items():
for item in k:
df_dict[int(item)] = v
wind_df = pd.DataFrame.from_dict(df_dict,orient='index').reset_index()
wind_df.columns=['windBearing', 'State']
new_df = pd.merge(wind,wind_df,on=['windBearing'],how='left')
<小时/>
print(new_df)
time temperature windBearing windSpeed ozone \
0 0 2018-09-20 01:00:00 18.46 228 5.76 291.0
1 1 2018-09-20 02:00:00 18.05 214 5.36 292.1
2 2 2018-09-20 03:00:00 18.07 214 5.58 292.1
3 3 2018-09-20 04:00:00 18.19 216 5.99 291.9
4 4 2018-09-20 05:00:00 18.31 218 6.31 291.9
pressure State
0 1014.5 SW
1 1014.5 SW
2 1014.3 SW
3 1013.9 SW
4 1013.5 SW
关于python - 将风向字典映射到新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60249618/