繁体   English   中英

Python熊猫。使用Series创建DataFrame不会保留dtype

[英]Python Pandas. Creating DataFrame with Series does not preserve dtype

我有一个用例,我认为这很常见,所以我认为我的这个问题应该很容易为自己回答,但我无法找到答案。 考虑以下。

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

基本上我是基于旧的DataFramedf的值创建一个DataFramedf2 现在,如果我们跑

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

我们得到

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

你可以看到, dtype的第一列的df2float64 ,而不是int64 ,因为它应该是,即使dtype的的Series本身int64 这种行为让我非常困惑,我无法相信这是故意的。 如何创建一个DataFrame从一些Series S和维护dtype的S- Series S' 在我看来,它应该像pandas.DataFrame([s1, s2], dtypes=[int, float]) ,但由于某些原因你不能在pandas这样做。

DataFrame的始终具有单个dtype。 (这是因为,在引擎盖下,Pandas存储了在块中具有相同dtype的数据 。)

pd.DataFrame传递一个Series列表时,它会将每个Series解压缩到一个单独的行中。 由于该系列具有不同的dtypes,因此列最终会显示具有混合dtypes的值。 Pandas尝试通过将每列中的所有值升级为单个dtype来解决此问题。


您可以使用以下命令定义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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM