向Pandas DataFrame单元格添加Numpy数组为何取决于初始化方式?
为什么给Pandas DataFrame赋值NumPy数组列表的操作结果取决于初始化方式?
我尝试用df.loc[df['B']==4,'A'] = [np.array([5, 6, 7, 8]),np.array([2,3])]把NumPy数组列表作为元素存入DataFrame,但发现这个操作能否成功完全取决于DataFrame的初始化方式。以下是两组测试代码:
运行失败的代码
import pandas as pd import numpy as np df = pd.DataFrame(columns=['A','B']) a = [1,2,0,4,5] b = [3,4,4,7,3] df['A'] = a df['B'] = b df.loc[df['B']==4,'A'] = [np.array([5, 6, 7, 8]),np.array([2,3])] df
运行正常的代码
import pandas as pd import numpy as np df = pd.DataFrame(columns=['A','B']) a = [1,2,0,4,5] b = [3,4,4,7,3] for i in range(len(a)): df.loc[i,'A'] = a[i] df.loc[i,'B'] = b[i] df.loc[df['B']==4,'A'] = [np.array([5, 6, 7, 8]),np.array([2,3])] df
原因解释
核心差异在于两种初始化方式导致了A列的数据类型不同:
- 直接赋值列的方式(
df['A'] = a):Pandas会自动推断列的 dtype 为int64(因为a中的元素都是整数)。这种强数值类型的列无法存储NumPy数组对象,赋值时Pandas会尝试将数组拆分为单个元素去匹配行,最终因元素长度不匹配导致操作失败。 - 循环逐行赋值的方式:每次通过
df.loc[i,'A'] = a[i]写入单个元素,Pandas无法确定统一的数值类型,会将列的 dtype 设置为object。object类型的列可以存放任意Python对象,包括NumPy数组,因此赋值NumPy数组列表时,能正常将每个数组作为单个元素存入对应行。
内容的提问来源于stack exchange,提问作者Anita Karsa
相关产品推荐
相关产品推荐

