2017-05-02 17 views
2

我有一個數據結構,看起來像這樣:如何推諉的NaN爲手段(),但通過多指標

S1 D1 1 2 3 4 5 
    D2 2 Nan 3 4 5 
    D3 3 4 5 Nan 6 
S2 D4 Nan 3 4 5 6 
    D5 6 7 8 9 0 
S3 D6 3 4 5 6 7 
    D7 4 5 6 7 Nan 
    D8 5 6 7 7 8 
    D9 2 3 4 5 6 

在S的是不同的國家,和D的不同地區。我如何將NAN列爲列的手段,但只是針對相應的國家,而不是所有列的手段?

完全stymid在這一個,任何幫助表示讚賞。

輸出應該是這個樣子:

S1 D1 1 2 3 4 5 
    D2 2 3 3 4 5 
    D3 3 4 5 4 6 
S2 D4 6 3 4 5 6 
    D5 6 7 8 9 0 
S3 D6 3 4 5 6 7 
    D7 4 5 6 7 7 
    D8 5 6 7 7 8 
    D9 2 3 4 5 6 

不是這個平均爲全列:

S1 D1 1 2 3 4 5 
    D2 2 4.25 3 4 5 
    D3 3 4 5 5.87 6 
S2 D4 3.25 3 4 5 6 
    D5 6 7 8 9 0 
S3 D6 3 4 5 6 7 
    D7 4 5 6 7 4.25 
    D8 5 6 7 7 8 
    D9 2 3 4 5 6 

謝謝。

回答

3

使用transform

df.fillna(df.groupby(level=0).transform('mean')) 

     2 3 4 5 6 
0 1       
S1 D1 1.0 2.0 3 4.0 5.0 
    D2 2.0 3.0 3 4.0 5.0 
    D3 3.0 4.0 5 4.0 6.0 
S2 D4 6.0 3.0 4 5.0 6.0 
    D5 6.0 7.0 8 9.0 0.0 
S3 D6 3.0 4.0 5 6.0 7.0 
    D7 4.0 5.0 6 7.0 7.0 
    D8 5.0 6.0 7 7.0 8.0 
    D9 2.0 3.0 4 5.0 6.0 
+0

很簡單,你搖滾。謝謝,第一次工作完美。 –

+0

這對我來說實現了一個簡單的內插/外插:df.fillna(df.groupby(level = 0).transform(lambda x:x.interpolate(method ='linear')。bfill().ffill()) – MyopicVisage

4
In [354]: df.fillna(df.mean(level=0)) 
Out[354]: 
     2 3 4 5 6 
0 1 
S1 D1 1.0 2.0 3 4.0 5.0 
    D2 2.0 3.0 3 4.0 5.0 
    D3 3.0 4.0 5 4.0 6.0 
S2 D4 6.0 3.0 4 5.0 6.0 
    D5 6.0 7.0 8 9.0 0.0 
S3 D6 3.0 4.0 5 6.0 7.0 
    D7 4.0 5.0 6 7.0 7.0 
    D8 5.0 6.0 7 7.0 8.0 
    D9 2.0 3.0 4 5.0 6.0 
+0

謝謝麥克斯,像夢一樣工作,就像下面的一樣。 –