2016-12-13 29 views
-2

我具有其中具有例如數據幀的列:從浮子卸下0時的長度= 4,並用平均值熊貓替換爲NaN

df = [ A 
7280.0   
7330.0 
635.0 
540.0 
    NaN ] 

我想做的是去除最後0(來自728 和733 ),然後用平均值(在這個例子中(728 + 733 + 635 + 540)/ 4 = 659)代替NaN。什麼是最好的方法來做到這一點?

+1

會發生什麼,像'1234'或'1230.4'值? –

+0

爲什麼不從540? (我試圖理解刪除0的標準。) – DyZ

+0

「投射到整數和刪除最後的零」是一個奇怪的請求,沒有多大意義。你究竟在做什麼?你是否想要縮小超過1000的數字?你想截斷的值總是在相同的位置? –

回答

0

我認爲你需要按mask過濾,並通過10來應用底板劃分。最後fillna通過mean

df.A = df.A.mask(df.A // 1000 > 0, df.A // 10) 
df.A = df.A.fillna(df.A.mean()) 
print (df) 
     A 
0 728.0 
1 733.0 
2 635.0 
3 540.0 
4 659.0 

謝謝另一種解決方案:

df[df.A>1000]/=10 
df.A.fillna(df.A.mean(), inplace=True) 
print (df) 
     A 
0 728.0 
1 733.0 
2 635.0 
3 540.0 
4 659.0 

編輯的評論:

df = pd.DataFrame({'A': ['7280.0', '7330.0', '635.0', '540.0', np.nan, 'a']}) 
print (df) 
     A 
0 7280.0 
1 7330.0 
2 635.0 
3 540.0 
4  NaN 
5  a 

df.A = pd.to_numeric(df.A, errors='coerce') 
print (df) 
     A 
0 7280.0 
1 7330.0 
2 635.0 
3 540.0 
4  NaN 
5  NaN 

df.A = df.A.mask(df.A // 1000 > 0, df.A // 10) 
df.A = df.A.fillna(df.A.mean()) 
print (df) 
     A 
0 728.0 
1 733.0 
2 635.0 
3 540.0 
4 659.0 
5 659.0 
+0

'df.A.mean()'已經是平均值了,爲什麼用'len(df.index)'除? – DyZ

+0

@DYZ - 對不起,你是對的。謝謝。 – jezrael

+0

你實際上可以做'df [df.A> 1000]/= 10'而不是掩碼。然後'df.A.fillna(df.A.mean(),inplace = True)'。 – DyZ

0

使用pandas.Series.apply()pd.to_numeric()功能的另一種替代解決方案:

df = pd.DataFrame(['A', 7280.0, 7330.0, 635.0, 540.0, 'NaN']) 
df[0] = df[0].apply(lambda x: int(str(x)[:-3]) if (isinstance(x, float) and len(repr(x)) == 6 and x % 10.0 == 0.0) else x) 
df[df == 'NaN'] = pd.to_numeric(df[0], errors='coerce').mean() 
print(df) 

輸出:

 0 
0 A 
1 728 
2 733 
3 635 
4 540 
5 659