2017-08-19 119 views
1

我有一个数据集,每个国家的每个股票都有该日期和数据点(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 

因此,在上述数据点D2为XYZ的12.95需要由平均D2的替代在美国境内为12.95

我将不胜感激关于如何做到这一点。我创建了独特的日期的指标和计划使用数据透视表,其中价值通过各种数据点迭代诸如D1,D2等

cnt_avgs=rawdt.pivot_table(values=["d1",index=["country","],aggfunc=np.mean) 
+2

您有7列和6列名称,请检出此[post](https://stackoverflow.com/questions/20109391/how-to-make-good-reproducible-pandas-examples)询问有关熊猫的问题并更新数据框 – DJK

回答

0

我不能完全肯定,如果这是你在找什么。但是你可以遍历所有的NaN列,然后缺失值的行和使用numpy.mean和有条件的大熊猫切片替代缺失值:

列表转换成一个数据帧大熊猫:

df = pd.DataFrame(dt[1:], columns=dt[0]) 

检查和迭代在具有NaN值的列上。然后,对于具有楠列,遍历行和使用numpy的平均函数改变数据和熊猫条件切片:

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]) 
0

IIUC,用groupbyfillna

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