![](/img/trans.png)
[英]In Python, Pandas. How to subset dataframe by WOM - 'Week of the Month'?
[英]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
基本上我是基于旧的DataFrame
, df
的值创建一个DataFrame
, df2
。 现在,如果我们跑
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
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.