我有一个我认为很常见的用例,所以我认为我的这个问题应该很容易自己回答,但我找不到任何地方的答案。请考虑以下事项。
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
可以看到df2
第一列的dtype
是float64
,而不是int64
它应该是,即使 Series
本身的 dtype
是 int64
。这种行为让我很困惑,我不敢相信这是故意的。如何从一些 Series
创建 DataFrame
并保留 Series
的 dtype
?在我看来,它应该像 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/