我有一個包含數字和NaN值的簡單串列。有沒有辦法AVG在兩個NaN值之間取值?一個例子可能是這樣的:
list = [NaN, 5, 6, 7, NaN, NaN, NaN, 6, 2, 8, 5, 4, NaN, NaN]
我希望輸出像
Output = [6,5]
uj5u.com熱心網友回復:
使用groupby來自itertools-
import numpy as np
from itertools import groupby
NaN = np.nan
lst = [NaN, 5, 6, 7, NaN, NaN, NaN, 6, 2, 8, 5, 4, NaN, NaN]
[np.mean(list(g)) for k, g in groupby(lst, key=lambda x: x is not NaN) if k]
# [6.0, 5.0]
uj5u.com熱心網友回復:
繼https://stackoverflow.com/a/30825549/1021819 之后,首先將串列拆分為分塊的串列串列:
NaN=None # or np.nan, float('nan'), 'nan' or any other separator value you like = even '/'
my_list = [NaN, 5, 6, 7, NaN, NaN, NaN, 6, 2, 8, 5, 4, NaN, NaN]
from itertools import groupby
chunks = list(list(g) for k,g in groupby(my_list, key=lambda x: x is not NaN) if k))
# [[5, 6, 7], [6, 2, 8, 5, 4]]
然后你可以使用內置的statistics.mean()如下:
import statistics
output = [statistics.mean(chunk) for chunk in chunks]
# [6, 5]
你去吧。
筆記:
- 不需要
numpy。但如果你確實想要一個純粹的numpy解決方案,你可以使用https://stackoverflow.com/a/31863171/1021819 - 不要使用
list變數名,因為它是內置型別的名稱!
uj5u.com熱心網友回復:
一種不需要額外技能的簡單方法:
import numpy as np
## NaN is assumed to be pre-defined by the users, e.g.: NaN = np.nan or NaN = float('nan')
def get_mean_between_nan(ar):
out = list()
t = list()
for x in ar:
if np.isnan(x):
if len(t) > 0:
out.append(np.mean(t))
t = list()
else:
t.append(x)
if len(t) > 0:
out.append(np.mean(t))
return out
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/377534.html
