【问题标题】:pandas shift converts my column from integer to float.pandas shift 将我的列从整数转换为浮点数。
【发布时间】:2017-06-11 17:24:42
【问题描述】:

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

【问题讨论】:

  • 你可以使用这个技巧:df['b'] = df['a'].shift(1).fillna(-1).astype(df.a.dtype)

标签: python pandas numpy


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

从 pandas 1.0.0 开始,我相信您还有另一个选择,那就是首先使用 convert_dtypes。这会将数据框列转换为支持 pd.NA 的 dtypes,从而避免了 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】:

    0.24以下pandas的解决方案:

    问题是你得到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
    

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

    fill_value 对象,可选
    用于新引入的缺失值的标量值。默认值取决于 self 的 dtype。对于数值数据,使用 np.nan。对于日期时间、时间增量或周期数据等,使用 NaT。对于扩展 dtype,使用 self.dtype.na_value。

    在 0.24.0 版中更改。

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

    【讨论】:

    • 另一个问题是,如果移位引入了 NaN 从而将所有整数转换为浮点数,则会发生一些舍入(例如在纪元时间戳上),因此即使将其重铸回整数也不会复制它原来的样子.有什么办法解决这个问题?
    • 很遗憾没有。
    • @guy:在这种情况下应该可以使用convert_dtypes 函数,正如您在@totalhack 答案(here)中看到的那样。它应该将您的数据转换为所谓的ExtensionDtype,它将保持整数但支持pd.NA,因此您可以使用shift 方法,该方法不会将您的整数转换为浮点数,因为您已使用@987654338 将其转换为整数类型@支持。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      您可以通过将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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 2014-02-13
        • 2017-10-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多