我有一个数据集,其中包含每个国家/地区每个库存的特定日期(d1,d2,d3等)的日期和数据点。每个国家的一些股票缺少一些数据点,我想用其他国家的股票平均值替换它们
date stock d1 d2 d3 country
12.94 xyz corp 12 3 4 US
12.95 xyz corp 13 NaN 1 US
12.95 123 corp 3 4 12 US
12.94 abc corp 1 3 5 CA
12.94 abc corp NaN 3 4 CA
因此,在上述数据中,12.95的xyz点d2需要被美国境内d2的平均值替换为12.95
我很感激有关如何做到这一点的任何见解。我创建了一个独特日期的索引,并计划使用数据透视表,其中值迭代各种数据点,如d1,d2等
cnt_avgs=rawdt.pivot_table(values=["d1",index=["country","],aggfunc=np.mean)
答案 0 :(得分:0)
我不确定这是否是你要找的东西。但您可以遍历所有NaN列,然后迭代缺失值行,并使用numpy.mean和条件pandas切片替换缺少的值:
将列表转换为pandas数据帧:
df = pd.DataFrame(dt[1:], columns=dt[0])
检查并迭代具有NaN值的列。然后,对于具有NaN的列,迭代行并使用numpy mean函数和pandas条件切片更改数据:
for col in df.columns[df.isnull().any()]:
for row in df[df[col].isnull()].iterrows():
df.loc[row[0], col] = np.mean(df[(df['date'] == row[1]['date']) & (df['country'] == row[1]['country'])][col])
答案 1 :(得分:0)
IIUC,使用groupby
和fillna
:
df.groupby(['date','country'],as_index=False)\
.apply(lambda x: x.fillna(x.mean()))\
.reset_index(drop=True)
输出:
date stock d1 d2 d3 country
0 12.94 abc corp 1.0 3.0 5 CA
1 12.94 abc corp 1.0 3.0 4 CA
2 12.94 xyz corp 12.0 3.0 4 US
3 12.95 xyz corp 13.0 4.0 1 US
4 12.95 123 corp 3.0 4.0 12 US