DataFrame的分配无法正常工作,但dtypes已更改

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DataFrame的分配无法正常工作,但dtypes已更改相关的知识,希望对你有一定的参考价值。

DataFrame的分配无法正常工作,但dtypes已更改。

数据科学的新手,我想把target_frame分配给empty_frame,但是直到再次分配它才能工作。在任务期间,dtypesempty_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时删除列的名称。

我想弄清楚的两件事:

  1. 为什么empty_frame的数据类型发生了变化。
  2. 为什么我的代码中显示的解决方案可以解决此分配问题。

谢谢。

答案

如果我正确理解你的问题,那么当你创建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)。

以上是关于DataFrame的分配无法正常工作,但dtypes已更改的主要内容,如果未能解决你的问题,请参考以下文章

分配 pandas 数据框列 dtypes

保存 pd.DataFrame 时如何强制 parquet dtypes?

地图功能无法与 Dataframe(toDF)一起正常工作 [重复]

加入 Dataframe 的相同列后,Drop 功能无法正常工作

将嵌套 JSON 转换为 pandas DataFrame

无法分配用户 ID 作为参考