gpt4 book ai didi

python - 如何阻止 Pandas DataFrame 无缘无故地将 int 转换为 float?

转载 作者:太空狗 更新时间:2023-10-30 00:12:27 26 4
gpt4 key购买 nike

我正在创建一个小型 Pandas DataFrame 并向其中添加一些应该是整数的数据。但是,即使我非常努力地将 dtype 显式设置为 int 并且只提供 int 值,它总是最终变成 float 。这对我来说毫无意义,而且行为甚至看起来都不完全一致。

考虑以下 Python 脚本:

import pandas as pd

df = pd.DataFrame(columns=["col1", "col2"]) # No dtype specified.
print(df.dtypes) # dtypes are object, since there is no information yet.
df.loc["row1", :] = int(0) # Add integer data.
print(df.dtypes) # Both columns have now become int64, as expected.
df.loc["row2", :] = int(0) # Add more integer data.
print(df.dtypes) # Both columns are now float64???
print(df) # Shows as 0.0.

# Let's try again, but be more specific.
del df
df = pd.DataFrame(columns=["col1", "col2"], dtype=int) # Explicit set dtype.
print(df.dtypes) # For some reason both colums are already float64???
df.loc["row1", :] = int(0)
print(df.dtypes) # Both colums still float64.

# Output:
"""
col1 object
col2 object
dtype: object
col1 int64
col2 int64
dtype: object
col1 float64
col2 float64
dtype: object
col1 col2
row1 0.0 0.0
row2 0.0 0.0
col1 float64
col2 float64
dtype: object
col1 float64
col2 float64
dtype: object
"""

我可以通过在最后执行 df = df.astype(int) 来修复它。还有其他方法可以修复它。但这不应该是必要的。我试图弄清楚我做错了什么,导致这些列首先变成了 float 。

这是怎么回事?

Python 版本 3.7.1 Pandas 版本 0.23.4

编辑:

我想可能有人误会了。此 DataFrame 中从来没有任何 NaN 值。创建后立即如下所示:

Empty DataFrame
Columns: [col1, col2]
Index: []

它是一个 Dataframe,df.shape=0,但其中没有 NaN,只是还没有行。

我还发现了更糟糕的事情。即使我在添加数据后执行 df = df.astype(int) 使其变为 int,只要我添加更多数据,它就会再次变为 float!

df = pd.DataFrame(columns=["col1", "col2"], dtype=int)
df.loc["row1", :] = int(0)
df.loc["row2", :] = int(0)
df = df.astype(int) # Force it back to int.
print(df.dtypes) # It is now ints again.
df.loc["row3", :] = int(0) # Add another integer row.
print(df.dtypes) # It is now float again???

# Output:
"""
col1 int32
col2 int32
dtype: object
col1 float64
col2 float64
dtype: object
"""

suggested fix in version 0.24似乎与我的问题无关。该功能与可空整数数据类型有关。我的数据中没有 NaN 或 None 值。

最佳答案

df.loc["rowX"] = int(0) 将起作用并解决问题中提出的问题。 df.loc["rowX",:] = int(0) 不起作用。这是一个惊喜。

df.loc["rowX"] = int(0) 提供了在保留所需数据类型的同时填充空数据框的能力。但是一次可以对整行执行此操作。

df.loc["rowX"] = [np.int64(0), np.int64(1)] 有效。

.loc[] 适用于根据 https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.loc.html 进行的基于标签的分配.注意:0.24 文档没有描述用于插入新行的 .loc[]。

该文档显示了使用 .loc[] 以列敏感方式通过赋值添加行。但是在 DataFrame 填充数据的地方这样做。

但是在空帧上切片时会变得很奇怪。

import pandas as pd
import numpy as np
import sys

print(sys.version)
print(pd.__version__)

print("int dtypes preserved")
# append on populated DataFrame
df = pd.DataFrame([[0, 0], [1,1]], index=['a', 'b'], columns=["col1", "col2"])
df.loc["c"] = np.int64(0)
# slice existing rows
df.loc["a":"c"] = np.int64(1)
df.loc["a":"c", "col1":"col2":1] = np.int64(2)
print(df.dtypes)

# no selection AND no data, remains np.int64 if defined as such
df = pd.DataFrame(columns=["col1", "col2"], dtype=np.int64)
df.loc[:, "col1":"col2":1] = np.int64(0)
df.loc[:,:] = np.int64(0)
print(df.dtypes)

# and works if no index but data
df = pd.DataFrame([[0, 0], [1,1]], columns=["col1", "col2"])
df.loc[:,"col1":"col2":1] = np.int64(0)
print(df.dtypes)

# the surprise... label based insertion for the entire row does not convert to float
df = pd.DataFrame(columns=["col1", "col2"], dtype=np.int64)
df.loc["a"] = np.int64(0)
print(df.dtypes)

# a surprise because referring to all columns, as above, does convert to float
print("unexpectedly converted to float dtypes")
df = pd.DataFrame(columns=["col1", "col2"], dtype=np.int64)
df.loc["a", "col1":"col2"] = np.int64(0)
print(df.dtypes)

3.7.2 (default, Mar 19 2019, 10:33:22) 
[Clang 10.0.0 (clang-1000.11.45.5)]
0.24.2
int dtypes preserved
col1 int64
col2 int64
dtype: object
col1 int64
col2 int64
dtype: object
col1 int64
col2 int64
dtype: object
col1 int64
col2 int64
dtype: object
unexpectedly converted to float dtypes
col1 float64
col2 float64
dtype: object

关于python - 如何阻止 Pandas DataFrame 无缘无故地将 int 转换为 float?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55455010/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com