两种方式为Pandas DataFrame单元格赋值NumPy数组的差异原因探究
两种Pandas赋值方式的差异原因解析
先看测试代码:
import numpy as np import pandas as pd rn = np.random.randint(1 , 100, size=(4,2)) # 生成随机数 df = pd.DataFrame(data=rn , columns=['a' , 'b' ]) df['b'] = df['b'].astype(object) # 将b列类型设为object c = np.array([1,4,4]) # 要存入DataFrame单个单元格的数组
方法1:df['b'].loc[0] = c
这个操作本质是先取出df['b']这个object类型的Series,再通过loc[0]定位到Series的单个元素位置,把numpy数组c作为一个整体对象赋值给这个位置。
Pandas允许给object类型的Series元素赋值任意Python对象(包括numpy数组),所以这个操作能成功。但出现SettingWithCopyWarning是因为:df['b']返回的是原DataFrame列的视图还是副本,Pandas无法明确判断——如果是副本的话,赋值操作不会同步到原DataFrame,所以弹出警告提醒你确认操作对象。
方法2:df.loc[0 , 'b'] = c
这个操作是直接通过DataFrame的loc索引器定位单个单元格。Pandas的loc在处理可迭代类型的值(比如numpy数组、列表)时,默认逻辑是尝试将可迭代对象的元素拆分,匹配目标位置的长度。
这里你要赋值的目标是单个单元格(长度为1),但数组c的长度是3,两者长度不匹配,所以触发ValueError,提示“设置可迭代对象时,键和值的长度必须相等”。
如果想用loc实现给单个单元格赋值数组的需求,可以把数组包装成一个单元素的列表,让Pandas把它当作一个整体对象处理:
df.loc[0, 'b'] = [c]
内容的提问来源于stack exchange,提问作者Aryo
相关产品推荐
相关产品推荐

