numpy pandas shift将我的列从整型转换为浮点型,

tuwxkamq  于 2023-02-23  发布在  其他
关注(0)|答案(6)|浏览(149)

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
a64a0gku

a64a0gku1#

0.24以下Pandas解:
问题是你得到的NaN值是float,所以int被转换为float-参见na类型的促销。
一种可能的解决方案是将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

panda 0.24+的解决方案-检查Series.shift

填充值对象,可选

用于新引入的丢失值的标量值。缺省值取决于self的数据类型。对于数值数据,使用np.nan。对于日期时间、时间增量或周期数据等,使用NaT。对于扩展数据类型,使用self.dtype.na_value。
在版本0.24.0中进行了更改。

df['b'] = df['a'].shift(fill_value=0)
zhte4eai

zhte4eai2#

另一个解决方案从panda版本0.24.0开始:只需提供参数fill_value的值:

df['b'] = df['a'].shift(1, fill_value=0)
zte4gxcn

zte4gxcn3#

可以通过将0预先添加到列a的所有元素(除了最后一个元素)来构造numpy数组

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
t3irkdon

t3irkdon4#

从Pandas1.0.0开始,我相信你还有另一个选择,那就是首先使用convert_dtypes。这会将 Dataframe 列转换为支持pd.NA的数据类型,从而避免了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
yv5phkfx

yv5phkfx5#

另一种解决方案是使用replace()函数和类型转换

df['b'] = df['a'].shift(1).replace(np.NaN,0).astype(int)
djp7away

djp7away6#

我不喜欢其他可能改变原始数据类型的答案,如果你的数据中有浮点数,字符串呢?既然我们不需要第一行,为什么不跳过它呢?
我将保留所有的dtype并进行强制转换:

dt = df.dtypes
df = df.shift(1).iloc[1:].astype(dt)

相关问题