df[条件][新增列名]与df.loc[条件][新增列名]区别(了解底层原因)

本文详细解析了Pandas库中如何通过条件筛选数据,以及如何对数据框的列进行操作,包括添加新列、修改列值等,并区分了DataFrame与Series的数据类型。

在数据处理过程中,经常要对符合某种条件的行列进行操作,有时候会犯迷糊,这里详细解释一下pandas是怎么识别df[]的.

df[<条件>]   # 得到的是一个新的df1,对其进行任何操作,对原来的df不产生影响.
type(df[<条件>])   # 数据类型是DataFrame
>> <class 'pandas.core.frame.DataFrame'>


df['列名']   # 得到的是df中'列名'这一列,
type(df['列名'])   # 数据类型是series
>> <class 'pandas.core.series.Series'>

df['新列名'] = 0   # 原df发生改变,在df中添加新列,且新列取值为0

df[<条件>]['新增列名']=0   
# 这么写的本意是获取满足条件的新的df1,然后对新的df1增加新的一列,并将新的一列赋值为0,但此时会报错
# df[][] 这种结构,python会自动识别为获取Multiindex,具体见下图


=======================================================
=======================================================
df.loc[<条件>][<新增列名>]   
# 本质是一个函数.loc[row_index,col_index]有自己特定的语法规范
# df.loc[<条件>][<新增列名>]是想当然的,是不合语法的

当输入,

df[<条件>]['新增列名']=0

在这里插入图片描述

会出现上图提醒,并给出参考链接,意思是df[][]默认是寻求Multiindex多级索引.

在这里插入图片描述

此时不得不感慨一下Python的强大,其实此处Python直接提醒一下index错误就可以了,但是她没有偷懒,而是明白了你的意思,给你一个参考解决方案.

.

.

.

2018-11-26 18:48:39写于滨州市太阳花咖啡书屋

任务描述 本关任务:通过相关知识介绍的取值方法,得到目标DataFrame对象,具体要求请查看编程要求。 相关知识 将DataFrame看作字典 DataFrame可以看作一个由若干Series对象构成的字典,可以通过对列名进行字典形式的取值获取数据。 In: area = pd.Series({'California': 423967, 'Texas': 695662, 'New York': 141297, 'Florida': 170312, 'Illinois': 149995}) In: pop = pd.Series({'California': 38332521, 'Texas': 26448193, 'New York': 19651127, 'Florida': 19552860, 'Illinois': 12882135}) In: data = pd.DataFrame({'area':area, 'pop':pop}) In: data["area"] # data.area 这种属性形式也可以获取到相同的结果 Out: California 423967 Florida 170312 Illinois 149995 New York 141297 Texas 695662 Name: area, dtype: int64 虽然属性形式的数据选择方法很方便,但是它并不是通用的。如果列名不是纯字符串,或者列名DataFrame的方法同名,那么就不能用属性索引。例如,DataFrame有一个pop()方法,如果用data.pop就不会获取'pop'列,而是显示为方法。 In: data.pop is data['pop'] Out: False 所以,尽量避免用属性形式选择的列直接赋值,即避免data.pop=z这种方式赋值。 和Series对象一样,可以用字典形式的语法调整对象,例如增加一列数据。 In: data["density"] = data['pop']/data['area'] In: data Out: area pop density California 423967 38332521 90.413926 Florida 170312 19552860 114.806121 Illinois 149995 12882135 85.883763 New York 141297 19651127 139.076746 Texas 695662 26448193 38.018740 将DataFrame看作二维数组 DataFrame可以看成是一个增强版的二维数组,许多数组操作方式都可以用在DataFrame对象上,例如,用values属性按行查看数组数据,对DataFrame进行转置等等。 In: data.values Out: array( [[ 4.23967000e+05, 3.83325210e+07, 9.04139261e+01], [ 1.70312000e+05, 1.95528600e+07, 1.14806121e+02], [ 1.49995000e+05, 1.28821350e+07, 8.58837628e+01], [ 1.41297000e+05, 1.96511270e+07, 1.39076746e+02], [ 6.95662000e+05, 2.64481930e+07, 3.80187404e+01]]) In: data.T Out: 将DataFrame看作数组时,我们可以是使用单个行索引获取一行数据。 In: data.values[0] #取一行数据 Out: array([ 4.23967000e+05, 3.83325210e+07, 9.04139261e+01]) 而获取一列数据就需要向DataFrame传递单个列索引,字典形式的操作相同,都是用data["列名"]获取。 因此,在进行数组形式的取值时,我们就需要用另一种方法——前面介绍过的Pandas索引器loc、iloc和ix了。通过iloc索引器,我们就可以像对待NumPy数组一样索引Pandas的底层数组(Python的隐式索引),DataFrame的行列标签会自动保留在结果中。 In: data.iloc[1:3, :2] # 隐式 Out: area pop Florida 170312 19552860 Illinois 149995 12882135 In: data.loc[:'Illinois', :'pop'] #显式 Out: area pop California 423967 38332521 Florida 170312 19552860 Illinois 149995 12882135 任何用于处理NumPy形式数据的方法都可以用于这些索引器,例如在loc索引器中结合使用掩码花哨索引方法。 In: data.loc[data.density > 100, ['pop', 'density']] Out: pop density Florida 19552860 114.806121 New York 19651127 139.076746 其他取值方法 还有一些取值方法和前面介绍过的方法不太一样,但是在实际应用中非常实用。 data["列名"] data["A列":"B列"] data[0:3] # 取第一到第四行 data[data.density > 100] #取density列值大于100的行 编程要求 本关的编程任务是补全右侧上部代码编辑区内的相应代码,要求实现如下功能: 完成下列要求。初始DataFrame如图所示: 根据相关知识介绍的取值方法将初始DataFrame转换成下图所示DataFrame,并输出: Florida Washington deaths 616 62 battles 2 3 size 1400 849 veterans 26 48 readiness 3 3 armored 1 1 deserters 2 31 具体要求请参见后续测试样例。 请先仔细阅读右侧上部代码编辑区内给出的代码框架,再开始你的编程工作! 测试说明 平台会对你编写的代码进行测试,对比你输出的数值实际正确的数值,只有所有数据全部计算正确才能进入下一关。 测试输入: 无测试输入 预期输出: Florida Washington deaths 616 62 battles 2 3 size 1400 849 veterans 26 48 readiness 3 3 armored 1 1 deserters 2 31
05-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值