python - 分配给 DataFrame 不起作用,但 dtypes 已更改
问题描述
分配给 DataFrame 不起作用,但 dtypes 发生了变化。
数据科学的新手,我想将 分配target_frame
给empty_frame
,但直到再次分配它才起作用。并且在分配期间,dtypes
ofempty_frame
已从 更改int32
为float64
并最终设置为int64
。
我尝试将我的模型简化为下面的代码,它们有同样的问题。
import pandas as pd
import numpy as np
dataset = [[[i for i in range(5)], ] for i in range(5)]
dataset = pd.DataFrame(dataset, columns=['test'])
empty_numpy = np.arange(25).reshape(5, 5)
empty_numpy.fill(np.nan)
# Solution 1: change the below code into 'empty_frame = pd.DataFrame(empty_numpy)' then everything will be fine
empty_frame = pd.DataFrame(empty_numpy, columns=[str(i) for i in range(5)])
series = dataset['test']
target_frame = pd.DataFrame(list(series))
# Solution 2: run `empty_frame[:] = target_frame` twice, work fine to me.
# ==================================================================
# First try.
empty_frame[:] = target_frame
print("="*40)
print(f"Data types of empty_frame: {empty_frame.dtypes}")
print("="*40)
print("Result of first try: ")
print(empty_frame)
print("="*40)
# Second try.
empty_frame[:] = target_frame
print(f"Data types of empty_frame: {empty_frame.dtypes}")
print("="*40)
print("Result of second try: ")
print(empty_frame)
print("="*40)
# ====================================================================
我希望上面的代码输出应该是:
========================================
Data types of empty_frame: 0 int64
1 int64
2 int64
3 int64
4 int64
dtype: object
========================================
Result of first try:
0 1 2 3 4
0 0 1 2 3 4
1 0 1 2 3 4
2 0 1 2 3 4
3 0 1 2 3 4
4 0 1 2 3 4
========================================
但是当我第一次尝试时它不起作用。
这个问题有两种解决方案,但我不知道为什么:
- 正如我在代码中展示的那样,一次尝试两次分配。
- 创建时删除列的名称
empty_frame
。
我想弄清楚两件事:
- 为什么
empty_frame
的数据类型发生了变化。 - 为什么我的代码中显示的解决方案可以解决这个分配问题。
谢谢。
解决方案
如果我正确理解了您的问题,那么当您创建 empty_numpy 矩阵时,您的问题就开始了。我最喜欢的解决方案是使用empty_numpy = np.empty([5,5])(默认 dtypes 是 float64 这里)。那么“第一次尝试的结果:”是正确的。它的意思是:
import pandas as pd
import numpy as np
dataset = [[[i for i in range(5)],] for i in range(5)]
dataset = pd.DataFrame(dataset, columns=['test'])
empty_numpy = np.empty([5,5])
# here you may add empty_numpy.fill(np.nan) but it's not necessary,result is the same
empty_frame = pd.DataFrame(empty_numpy, columns=[str(i) for i in range(5)])
series = dataset['test']
target_frame = pd.DataFrame(list(series))
# following assignment is correct then
empty_frame[:] = target_frame
print('='*40)
print(f'Data types of empty_frame: {empty_frame.dtypes}')
print('='*40)
print("Result of first try: ")
print(empty_frame)
print("="*40)
或者只是将 dtype 属性添加到您的 np.arrange 调用中,就像这样:
empty_numpy = np.arange(25, dtype=float).reshape(5, 5)
然后它也可以工作(但它有点无聊;o)。
推荐阅读
- android - NotificationManager.notify 不会在一个应用程序中创建通知,尽管完全相同的编码在另一个应用程序中工作
- java - 如何使用两个不同的api取消异步spring方法
- javascript - 二维多边形的边界
- windows-server-2008 - 从 windows server 2008 卸载 AD 角色
- mysql - MySQL结构题
- python - Django CreateView get_initial 外键
- python - TensorFlow 的 random_poisson 仅在 CPU 上运行
- reactjs - React API 元素未显示在页面上
- scala - 安装了 spark-shell 的节点上的 scala 在哪里?
- jenkins - 如何在脚本化的 Jenkinsfile 中使用多个属性?