python Pandas 。使用 Series 创建 DataFrame 不会保留 dtype

标签 python pandas

我有一个我认为很常见的用例,所以我认为我的这个问题应该很容易自己回答,但我找不到任何地方的答案。请考虑以下事项。

df = pandas.DataFrame({"id": numpy.random.choice(range(100), 5, replace=False),
                       "value": numpy.random.rand(5)})
df2 = pandas.DataFrame([df["id"], df["value"]*2]).T

基本上我正在创建一个DataFramedf2,基于旧的DataFramedf的值>。现在如果我们运行

print(df.dtypes, end="\n------\n")
print(df2.dtypes)

我们得到

id         int64
value    float64
dtype: object
------
id       float64
value    float64
dtype: object

可以看到df2第一列的dtypefloat64,而不是int64它应该是,即使 Series 本身的 dtypeint64。这种行为让我很困惑,我不敢相信这是故意的。如何从一些 Series 创建 DataFrame 并保留 Seriesdtype?在我看来,它应该像 pandas.DataFrame([s1, s2], dtypes=[int, float]) 一样简单,但您不能在 pandas 出于某种原因。

最佳答案

DataFrame 的

总是有一个数据类型。 (这是因为,在 引擎盖,Pandas 在 block 中存储具有相同 dtype 的数据。)

pd.DataFrame 被传递一个 Series 列表时,它 将每个 Series 解包到单独的行中。由于 Series 具有不同的数据类型,因此列最终具有混合数据类型的值。 Pandas 试图通过将每列中的所有值升级为单个数据类型来解决此问题。


你可以定义df2:

df2 = pd.DataFrame({'id': df["id"], 'value': df["value"]*2})

df2 = df.copy()
df2['value'] *= 2

df2 = pd.concat([df["id"], df["value"]*2], axis=1)

关于 python Pandas 。使用 Series 创建 DataFrame 不会保留 dtype,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35295741/

相关文章:

python - Networkx Python 中的权重相乘

python - 使用 Pandas 风格我得到 KeyError : "None of . ...位于 [列]

python - 在 Python 中将时间序列数据拆分为训练测试集和有效集

python - 将带有空格的数据帧转换为数字、障碍物 - 空格(例如 3 014.0 即 '3\xa0014.0' )

python - Pandas :当键是数据帧的索引时,从字典向数据帧添加一列

python 并行套接字连接

python - 在 python3 sqlite 中加载 sqlite3 扩展

python - 如何动态地将数据从列表添加到数据库(PostgreSQL)

python - Numpy ndarray 最小/最大方法中的错误

python - PYQT4, ListView : How to get selected rows using QStandardItemModel