2017-01-26 23 views
9

shift Sütüm, tam sayıdan yüzmeye dönüştürür. Bu np.nan sadece süzülüyor. Değiştirilen sütunu tamsayı olarak tutmanın herhangi bir yolu var mı? na type promotions bkz -pandas shift, sütümümün tamsayıdan yüzmeye dönüştürür.

df = pd.DataFrame({"a":range(5)}) 
df['b'] = df['a'].shift(1) 

df['a'] 
# 0 0 
# 1 1 
# 2 2 
# 3 3 
# 4 4 
# Name: a, dtype: int64 

df['b'] 

# 0 NaN 
# 1  0 
# 2  1 
# 3  2 
# 4  3 
# Name: b, dtype: float64 
+1

bu hack'i kullanabilirsiniz: 'df ['b'] = df ['a']. Shift (1) .fillna (-1) .astype (df.a.dtype)' – MaxU

cevap

6

Sorun float ne NaN değeri, bu nedenle intfloat dönüştürülür olsun.

df = pd.DataFrame({"a":range(5)}) 
df['b'] = df['a'].shift(1).fillna(0).astype(int) 
print (df) 
    a b 
0 0 0 
1 1 0 
2 2 1 
3 3 2 
4 4 3 
+0

Başka bir sorun Eğer vardiya bir NaN ortaya çıkarırsa ve böylece tüm tam sayıları yüzer hale getirirse, meydana gelen bir miktar yuvarlama olur (örn. epoch zaman damgalarında), böylece tamsayıya geri çağırmak bile orijinal olarak ne olduğunu çoğaltmaz. Bunu düzeltmenin herhangi bir yolu var mı? – guy

+0

Ne yazık ki hayır. – jezrael

3

Hepiniz bir 0 ama sütunda a son elemanını prepending bir numpy dizi oluşturabilirsiniz:

Olası bir çözüm int mümkün dönüştürmek o zaman 0 gibi bazı değere NaN değerlerini dönüştürmek ve

df.assign(b=np.append(0, df.a.values[:-1])) 

    a b 
0 0 0 
1 1 0 
2 2 1 
3 3 2 
4 4 3 
0

başka bir çözüm yerine kullanmaktır() işlevi ve tip

döküm
df['b'] = df['a'].shift(1).replace(np.NaN,0).astype(int)