根据笔者的实践经验,对Dataframe 对象取值与赋值做一总结。
示例参考笔者上一篇博客:https://blog.csdn.net/ziyi_gong/article/details/105376758
取值
data=np.around(np.random.randn(3,4),decimals=2)
data = pd.DataFrame(data,columns=('A','B','C','D'))
print(type(data['A']))
直接取出某一列时,类型为Series 。
<class 'pandas.core.series.Series'>
需要注意上述用法在对Dataframe 和 Series 用的时候的不同,譬如:
data_A = data['A'] # 类型为序列,属性有index 和值
print(data_A)
print(data_A[0]) # 直接为值,展示值的具体类型
print(type(data_A[0]))
结果为:
0 1.76
1 1.15
2 0.23
Name: A, dtype: float64
1.76
<class 'numpy.float64'>
dataframe 取出的结果多于两列时,其结果为
另外当 .loc 取值具体到某一个点位时,其所取也为值!
赋值
在python 做数据处理的过程中,我们也经常需要对dataframe 框架中的某些列进行直接赋值,我们常见的赋值语句:
# 情形一 : 直接赋值,赋予行列相同的numpy 数组,成功
data[['A','B']]= np.array([1,2,3,4,5,6]).reshape(3,2)
# 情形二 : 赋值,赋予index相同的数值,成功
data_rep = pd.DataFrame(np.array([1,2,3,4,5,6]).reshape(3,2) ,index =[0,1,2])
data[['A','B']]= data_rep
# 情形三 : 赋值,赋予index不同的数值,失败!
data_rep = pd.DataFrame(np.array([1,2,3,4,5,6]).reshape(3,2) ,index =[0,7,8])
data[['A','B']]= data_rep
# 情形四 : 赋值,如果是空的dataframe 赋予dataframe ,成功!
data = pd.DataFrame(columns=('A','B','C','D'))
# 情形五 : 赋值,如果是空的dataframe 赋予numpy数组,失败!
data[['A','B']]= np.array([1,2,3,4,5,6]).reshape(3,2)
# 情形六 : 赋值,如果是空的dataframe 必须要赋予数组,则可以这样赋予!
data['A'],data['B']= np.array([1,2,3]),np.array([4,5,6])
总结:
- 情形一 : 直接赋值,赋予行列相同的numpy 数组,成功
- 情形二 : 赋值,赋予index相同的数值,成功
- 情形三 : 赋值,赋予index不同的数值,失败!
- 情形四 : 赋值,如果是空的dataframe 赋予dataframe ,成功!
- 情形五 : 赋值,如果是空的dataframe 赋予numpy数组,失败!
- 情形六 : 赋值,如果是空的dataframe 必须要赋予数组,则可以这样赋予!
赋值的时候,也可以使用.loc进行赋值。如果赋予单个值,不需要注意该索引是否存在。 但是当索引以列表形式赋予的时候,则该索引必须是存在的!
# 成功!
data.loc[4,'A'] = 1
# 失败!
data.loc[[5,6,7],'A'] =1