我有一个用例,我认为这种情况很常见,所以我认为我的这个问题应该很容易为自己回答,但我无法在任何地方找到答案。请考虑以下事项。
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
基本上我是根据旧DataFrame
,df2
的值创建DataFrame
,df
。现在,如果我们运行
print(df.dtypes, end="\n------\n")
print(df2.dtypes)
我们得到了
id int64
value float64
dtype: object
------
id float64
value float64
dtype: object
您可以看到dtype
第一列的df2
为float64
,而不是int64
,即使dtype
也是如此Series
本身就是int64
。这种行为让我非常困惑,我无法相信这是故意的。如何从某些DataFrame
创建Series
并保留dtype
的{{1}}个?在我看来,它应该像Series
一样简单,但由于某种原因你不能在pandas.DataFrame([s1, s2], dtypes=[int, float])
中这样做。
答案 0 :(得分:4)
列始终只有一个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)