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

时间:2016-02-09 15:24:47

标签: 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

您可以看到dtype第一列的df2float64,而不是int64,即使dtype也是如此Series本身就是int64。这种行为让我非常困惑,我无法相信这是故意的。如何从某些DataFrame创建Series并保留dtype的{​​{1}}个?在我看来,它应该像Series一样简单,但由于某种原因你不能在pandas.DataFrame([s1, s2], dtypes=[int, float])中这样做。

1 个答案:

答案 0 :(得分:4)

DataFrame的

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

pd.DataFrame传递一个系列列表时,它 将每个系列解压缩到一个单独的行中。由于该系列具有不同的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)