shift
将我的列从整数转换为浮点数。事实证明np.nan
只是浮动的。有没有办法将移位列保持为整数?
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
答案 0 :(得分:12)
问题是NaN
值为float
,因此int
转换为float
- 请参阅na type promotions。
一种可能的解决方案是将NaN
值转换为某些值,例如0
,然后可以转换为int
:
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
答案 1 :(得分:4)
您可以通过将numpy
添加到列0
的最后一个元素之外的所有元素来构建a
数组
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
答案 2 :(得分:4)
自熊猫1.0.0起,我相信您还有另一种选择,那就是首先使用convert_dtypes。这样可以将数据框列转换为支持pd.NA的dtype,从而避免了NaN问题。
df = pd.DataFrame({"a":range(5)})
df = df.convert_dtypes()
df['b'] = df['a'].shift(1)
print(df['a'])
# 0 0
# 1 1
# 2 2
# 3 3
# 4 4
# Name: a, dtype: Int64
print(df['b'])
# 0 <NA>
# 1 0
# 2 1
# 3 2
# 4 3
# Name: b, dtype: Int64
答案 3 :(得分:3)
从熊猫版本0.24.0
开始的另一种解决方案:只需为参数fill_value
提供一个值:
df['b'] = df['a'].shift(1, fill_value=0)
答案 4 :(得分:0)
另一个解决方案是使用replace()函数和类型转换
df['b'] = df['a'].shift(1).replace(np.NaN,0).astype(int)