Pandas 中提供了多种查询函数,方便我们的数据查询操作,我们需要查询的数据条件不同,所采用的操作也有所不同,总的来说,我们的查询条件可以为按单个值查询、按值列表查询、按值区间查询、按条件表达式查询和按函数查询五种查询的方式,接下来我们将以 loc () 查询函数为例,详细讲解每种查询的具体操作。
loc( ) 通过标签或布尔数字查询数据集 (推荐使用的查询方法)
iloc( ) 通过索引位来查询数据集
query( ) 通过布尔表达式查询数据列
loc () 的查询条件,可以使用 label 值,也可以使用布尔值,他丰富的传值方式,以及简洁的使用方式,成为 Pandas 数据查询较为常用的方法。
这里我们通过解析 Excel 数据文件,获得了数据,具体数据解析内容如下:
import pandas as pd
data_path = "C:/Users/Dell/Desktop/demo.xlsx"
data = pd.read_excel(data_path)
print(data)
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
1 python 1991 222 67.0
2 c 1927 333 33.9
3 js 1995 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75.0
1. 按单个值查询
loc () 多个查询值的传递,第一个参数选择 index (行索引值,最左侧一列),第二个参数选择 column(列索引值,最上面一行),如果参数传错,查询时汇报索引值查找错误。
import pandas as pd
data_path = "C:/Users/Dell/Desktop/demo.xlsx"
data = pd.read_excel(data_path)
print(data.loc[1])
print(data.loc[1,'价格'])
编程语言 python
推出时间 1991
创始人 222
价格 67
Name: 1, dtype: object
67.0
2. 按列表查询
在 loc () 函数中,我们通过传入要查询的列表项,可以查询多个数据内容,返回的数据结果是 Series 数据结构或者 DataFrame 数据结构。
import pandas as pd
data_path = "C:/Users/Dell/Desktop/demo.xlsx"
data = pd.read_excel(data_path)
print(data.loc[[1,2,5],['编程语言','价格']])
编程语言 价格
1 python 67.0
2 c 33.9
5 c++ 75.0
3. 按区间查询
按区间查询主要用到了英文状态下的冒号 “:” ,冒号左侧是区间的开始位置,右侧是结束位置。
print(data.loc[0:5, ['编程语言', '价格']])
print(data.loc[0:5, '推出时间':'价格'])
编程语言 价格
0 Java 45.6
1 python 67.0
2 c 33.9
3 js 59.5
4 php 69.9
5 c++ 75.0
#这里的行索引我们传入的是区间 0:5,从结果中可以看到数据内容正是这 6 行的数据,其中是包含区间两端的值的。
推出时间 创始人 价格
0 1995 111 45.6
1 1991 222 67.0
2 1927 333 33.9
3 1995 444 59.5
4 2012 555 69.9
5 1983 666 75.0
4. 按条件查询
按条件查询是查询数据符合一定条件的数据集,包括大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、等于(==)、不等于(!=)等条件。
print(data.loc[data['价格']<60])
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
2 c 1927 333 33.9
3 js 1995 444 59.5
print(data.loc[(data['价格'] <= 69.9) & (data['推出时间'] == 1927)])
编程语言 推出时间 创始人 价格
2 c 1927 333 33.9
5. 按函数查询
函数查询是在查询的参数中传入函数,查询使该函数返回为 True 的数据集。
print(data.loc[data['推出时间'].isin([1927,1995,1983])])
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
2 c 1927 333 33.9
3 js 1995 444 59.5
5 c++ 1983 666 75.0
新增数据列:
1.直接新增数据列
data_path = "C:/Users/Dell/Desktop/demo.xlsx"
data = pd.read_excel(data_path)
print(data)
data['new_colume'] = ['a', 'b', 'c', 'd', 'e', 'f']
print(data)
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
1 python 1991 222 67.0
2 c 1927 333 33.9
3 js 1995 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75.0
编程语言 推出时间 创始人 价格 new_colume
0 Java 1995 111 45.6 a
1 python 1991 222 67.0 b
2 c 1927 333 33.9 c
3 js 1995 444 59.5 d
4 php 2012 555 69.9 e
5 c++ 1983 666 75.0 f
2.insert () 方法新增数据列
insert (loc, column, value, allow_duplicates=False)
loc 指定插入列的序号,从 0 开始
column 列索引名
value 插入的列数据
duplicates 是否允许插入已有的数据,如果为 False 插入重复数据会报错
data.insert(0, 'new', ['a', 'b', 'c', 'd', 'e', 'f'], allow_duplicates=False)
print(data)
new 编程语言 推出时间 创始人 价格
0 a Java 1995 111 45.6
1 b python 1991 222 67.0
2 c c 1927 333 33.9
3 d js 1995 444 59.5
4 e php 2012 555 69.9
5 f c++ 1983 666 75.0
data.insert(1, 'new', ['a', 'b', 'c', 'd', 'e', 'f'], allow_duplicates=False)
print(data)
编程语言 new 推出时间 创始人 价格
0 Java a 1995 111 45.6
1 python b 1991 222 67.0
2 c c 1927 333 33.9
3 js d 1995 444 59.5
4 php e 2012 555 69.9
5 c++ f 1983 666 75.0
新增数据行:
1.loc () 方法新增数据行
data.loc[6] = ['ss', 'dd', 23.1, 'ff']
print(data)
编程语言 推出时间 创始人 价格
0 Java 1995 111.0 45.6
1 python 1991 222.0 67
2 c 1927 333.0 33.9
3 js 1995 444.0 59.5
4 php 2012 555.0 69.9
5 c++ 1983 666.0 75
6 ss dd 23.1 ff
这里可以看到在原数据的基础上新增了行索引为 6 的数据行。但这里要注意,如果行索引指定的是已存在行索引,则不会进行数据行的插入,而是替换了该数据行的数据值。
2. append () 方法新增数据行
append (other, ignore_index=False, verify_integrity=False) 是用来在数据表尾新增数据行,并返回新增后的数据对象,该方法不仅仅适用于 DataFrame 结构的数据,还可以用于 Series 数据的追加。
other 要添加的数据,可以是 Series、list、dict、dataframe 等等;
ignore_index 新增了数据后,会重新设置索引,忽略旧的索引;
verify_integrity 当为 True 时,如果和原数据的索引值相同,将会报错;
import pandas as pd
data_path = "C:/Users/Dell/Desktop/demo.xlsx"
data = pd.read_excel(data_path)
# 创建一个dataframe对象
data_new = pd.DataFrame([[99, 88, 77, 66], [55, 44, 33, 22]], columns=['编程语言', '推出时间', '价格', '创始人'])
# 使用append增加行
result_data = data.append(data_new)
print(result_data)
print(result_data.loc[0])
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
1 python 1991 222 67.0
2 c 1927 333 33.9
3 js 1995 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75.0
0 99 88 66 77.0
1 55 44 22 33.0
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
0 99 88 66 77.0
这里可以看到通过 append () 操作是将两个数据集进行行的合并,在 data 数据集的基础上,后面合并 data_new 数据行。这里的索引并不会产生冲突,因为我们没有设置 verify_integrity=True(默认的是为 False),如果我们设置了 ignore_index= True ,合并后生成的新的数据集索引值会重新排列,如下操作所示:
import pandas as pd
data_path = "C:/Users/Dell/Desktop/demo.xlsx"
data = pd.read_excel(data_path)
# 创建一个dataframe对象
data_new = pd.DataFrame([[99, 88, 77, 66], [55, 44, 33, 22]], columns=['编程语言', '推出时间', '价格', '创始人'])
# 使用append增加行
result_data = data.append(data_new,ignore_index=True)
print(result_data)
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
1 python 1991 222 67.0
2 c 1927 333 33.9
3 js 1995 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75.0
6 99 88 66 77.0
7 55 44 22 33.0
删除指定行或列:
1.删除指定行
drop (labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors=‘raise’)
labels 标签(行标签或者列标签)
axis 表示删除行(axis=0 默认)或者删除列(axis=1)
index 删除的行索引名
columns 删除的列索引名
inplace 指定删除是否要在原数据上进行操作,默认是 False
import pandas as pd
data_path = "C:/Users/Dell/Desktop/demo.xlsx"
data = pd.read_excel(data_path)
print(data)
data_res = data.drop(labels=[1,3])
print(data_res)
print(data)
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
1 python 1991 222 67.0
2 c 1927 333 33.9
3 js 1995 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75.0
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
2 c 1927 333 33.9
4 php 2012 555 69.9
5 c++ 1983 666 75.0
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
1 python 1991 222 67.0
2 c 1927 333 33.9
3 js 1995 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75.0
这里值得注意的是:在执行删除操作后我们再次打印了原 data 数据集,通过输出可以看到,data 的数据并没有被影响到,还是完整的数据集。这里如果我们的 inplace 参数设置了 True,则对应的删除操作后,原数据就会被修改,通过下面的代码可以看到操作效果:
import pandas as pd
data_path = "C:/Users/Dell/Desktop/demo.xlsx"
data = pd.read_excel(data_path)
print(data)
data_res = data.drop(labels=[1,3],inplace=True)
print(data_res)
print(data)
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
1 python 1991 222 67.0
2 c 1927 333 33.9
3 js 1995 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75.0
None
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
2 c 1927 333 33.9
4 php 2012 555 69.9
5 c++ 1983 666 75.0
这里可以看到 data_res 的输出结果为 None ,而 data 原数据集则被删除了 1 和 3 的索引行。这是因为当我们设置了 inplace=True 时,drop () 操作后就不会返回一个新的数据集,而是在原数据集的基础上进行了操作,在实际应用中,如果不是特别的需要,建议不要指定该参数为 True,不然会改变原有数据对其他的分析产生一定的影响。(inplace是参数,无论是删除行,列还是行和列,只要是用drop函数就可以通过令inplace=Ture改变原数据)
2.删除指定列
import pandas as pd
data_path = "C:/Users/Dell/Desktop/demo.xlsx"
data = pd.read_excel(data_path)
print(data)
data_res = data.drop(labels=['推出时间','创始人'],axis=1)
print(data_res)
print(data)
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
1 python 1991 222 67.0
2 c 1927 333 33.9
3 js 1995 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75.0
编程语言 价格
0 Java 45.6
1 python 67.0
2 c 33.9
3 js 59.5
4 php 69.9
5 c++ 75.0
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
1 python 1991 222 67.0
2 c 1927 333 33.9
3 js 1995 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75.0
同样设置inplace=Ture后,drop () 操作后就不会返回一个新的数据集,而是在原数据集的基础上进行了操作。
3.删除指定行和列
import pandas as pd
data_path = "C:/Users/Dell/Desktop/demo.xlsx"
data = pd.read_excel(data_path)
print(data)
data_res = data.drop(index=4,columns=['价格'])
print(data_res)
print(data)
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
1 python 1991 222 67.0
2 c 1927 333 33.9
3 js 1995 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75.0
编程语言 推出时间 创始人
0 Java 1995 111
1 python 1991 222
2 c 1927 333
3 js 1995 444
5 c++ 1983 666
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
1 python 1991 222 67.0
2 c 1927 333 33.9
3 js 1995 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75.0
删除特定数据的行:
这里我们讲的删除特定数据的行或列,其实并不是真正意义上的删除内容,而是通过数据条件的筛选过滤,得到一个新的数据集,从效果上看,也是去除了部分数据内容,达到了我们删除数据的实际需要。
import pandas as pd
data_path = "C:/Users/Dell/Desktop/demo.xlsx"
data = pd.read_excel(data_path)
print(data)
data_res = data[data['价格']<50]
print(data_res)
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
1 python 1991 222 67.0
2 c 1927 333 33.9
3 js 1995 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75.0
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
2 c 1927 333 33.9
修改索引值:
很多时候我们创建的数据,或者解析出来的数据,索引都是默认生成的,而我们为了方便数据的分析,需要对数据的行索引值或者列索引值进行修改,那这里
Pandas 中提供了一个函数rename (self, mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False, level=None, errors=‘ignore’)
,该函数通过灵活的参数设置,能够高效便捷的进行索引值的修改,下面我们列举了常用的几个参数说明:
mapper 这里是要传入的映射关系,可以是个字典或者函数
index 指定行索引
columns 指定列索引
axis 表示修改行索引(axis=0 默认)还是列索引(axis=1)
inplace 是否在原数据基础上修改,默认 inplace=False 会返回一个新的数据集
1.修改行索引
import pandas as pd
data_path = "C:/Users/Dell/Desktop/demo.xlsx"
data = pd.read_excel(data_path)
print(data)
# 修改行索引
data_res = data.rename(index={0: 'aa', 2: 'bb', 3: 'dd'})
# data_res = data.rename({0: 'aa', 2: 'bb', 3: 'dd'},axis=0)和上面等价
print(data_res)
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
1 python 1991 222 67.0
2 c 1927 333 33.9
3 js 1995 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75.0
编程语言 推出时间 创始人 价格
aa Java 1995 111 45.6
1 python 1991 222 67.0
bb c 1927 333 33.9
dd js 1995 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75.0
2.修改列索引
import pandas as pd
data_path = "C:/Users/Dell/Desktop/demo.xlsx"
data = pd.read_excel(data_path)
print(data)
# 修改列索引
data_res = data.rename(columns={'编程语言': 'aa', '价格': 'bb'})
# data_res = data.rename({'编程语言': 'aa', '价格': 'bb'}, axis=1)和上面等价
print(data_res)
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
1 python 1991 222 67.0
2 c 1927 333 33.9
3 js 1995 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75.0
aa 推出时间 创始人 bb
0 Java 1995 111 45.6
1 python 1991 222 67.0
2 c 1927 333 33.9
3 js 1995 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75.0
3.同时修改行和列索引
import pandas as pd
data_path = "C:/Users/Dell/Desktop/demo.xlsx"
data = pd.read_excel(data_path)
print(data)
# 修改行和列索引
data_res = data.rename(index={0: 'aa', 2: 'bb', 3: 'dd'},columns={'编程语言': 'aa', '价格': 'bb'})
print(data_res)
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
1 python 1991 222 67.0
2 c 1927 333 33.9
3 js 1995 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75.0
aa 推出时间 创始人 bb
aa Java 1995 111 45.6
1 python 1991 222 67.0
bb c 1927 333 33.9
dd js 1995 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75.0
修改数据值:
1.修改单个数据值
修改单个数据值,是通过查询函数获取到某个数据,然后修改这个数据的内容,可以用函数 at []、iat []、loc []、iloc [],但要注意不同的函数所传递参数的不同,下面我们列举这四个函数的不同之处:
loc[] 只能使用标签索引,不能使用整数索引,通过标签索引切边进行筛选时
iloc[] 只能使用整数索引,不能使用标签索引,通过整数索引切边进行筛选时
at[] 只能使用标签索引,使用时必须输入两个参数,即行索引和列索引
iat[] 只能使用整数索引,使用时必须输入两个参数,即行索引和列索引
虽然四种函数都能获取单个数据值,进而进行修改,但从运行速度上四种方法从高到底分别为: iat []、at []、iloc []、loc [],这里我们选择 iat [] 演示对单个数据值的修改操作。
import pandas as pd
data_path = "C:/Users/Dell/Desktop/demo.xlsx"
data = pd.read_excel(data_path)
print(data)
# 对第2行,第3列修改数据
data.iat[1,2]=1234
print(data)
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
1 python 1991 222 67.0
2 c 1927 333 33.9
3 js 1995 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75.0
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
1 python 1991 1234 67.0
2 c 1927 333 33.9
3 js 1995 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75.0
我们通过 iat [] 对第 2 行,第 3 列数据进行修改,通过输出结果可看到原数据值为 222,这里被修改 1234
2.修改某类数据值
有时候我们需要对数据集中的一类数据进行修改,比如我们要将所有的 “1995 年” 换成字符串 “2000 年”,这时我们就需要用到函数
replace (to_replace=None,value=None……),该函数的两个核心参数 to_replace 表示要被替换的数据,value 是替换后的数据,该函数修改后,会返回新的数据集,不会影响到原数据。
import pandas as pd
data_path = "C:/Users/Dell/Desktop/demo.xlsx"
data = pd.read_excel(data_path)
print(data)
# 将所有的1995换成2020
new_data = data.replace(1995,2020)
print(new_data)
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
1 python 1991 222 67.0
2 c 1927 333 33.9
3 js 1995 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75.0
编程语言 推出时间 创始人 价格
0 Java 2020 111 45.6
1 python 1991 222 67.0
2 c 1927 333 33.9
3 js 2020 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75.0
这里可以看到原数据中所有的 “1995 年” 都被改成了 “2000 年”。这里我们要被修改的值也可以传入列表的形式,指定多个被修改的数据值,如下面代码所示:
import pandas as pd
data_path = "C:/Users/Dell/Desktop/demo.xlsx"
data = pd.read_excel(data_path)
print(data)
# 将所有的1995换成2020
new_data = data.replace([1995,2012,1983],2020)
print(new_data)
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
1 python 1991 222 67.0
2 c 1927 333 33.9
3 js 1995 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75.0
编程语言 推出时间 创始人 价格
0 Java 2020 111 45.6
1 python 1991 222 67.0
2 c 1927 333 33.9
3 js 2020 444 59.5
4 php 2020 555 69.9
5 c++ 2020 666 75.0
3.修改某区域数据值
我们还可以对某些行或列的数据进行统一的修改操作,这里我们可以使用函数 loc () 或 iloc () ,只是要注意传入的参数不同。下面我们使用 iloc () 修改整行或整列的数据操作:
import pandas as pd
data_path = "C:/Users/Dell/Desktop/demo.xlsx"
data = pd.read_excel(data_path)
print(data)
# 这里我们创建了一个新的数据集
data_new = pd.DataFrame([["11", "22", "33.5", "44"], ["55", "66", "77.7", "88"]],
columns=["编程语言", "推出时间", "价格", "创始人"])
data.iloc[[0, 1]] = data_new
print(data)
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
1 python 1991 222 67.0
2 c 1927 333 33.9
3 js 1995 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75.0
编程语言 推出时间 创始人 价格
0 11 22 44 33.5
1 55 66 88 77.7
2 c 1927 333 33.9
3 js 1995 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75
我们创建了一个新的数据集,用来替换原数据第 1 行和第 2 行的数据,通过输出结果可以看到被修改后的数据集。
import pandas as pd
data_path = "C:/Users/Dell/Desktop/demo.xlsx"
data = pd.read_excel(data_path)
print(data)
new_series = pd.Series(['11','22','33','44','55','66'])
data.iloc[:,[1]]=new_series
print(data)
编程语言 推出时间 创始人 价格
0 Java 1995 111 45.6
1 python 1991 222 67.0
2 c 1927 333 33.9
3 js 1995 444 59.5
4 php 2012 555 69.9
5 c++ 1983 666 75.0
编程语言 推出时间 创始人 价格
0 Java 11 111 45.6
1 python 22 222 67.0
2 c 33 333 33.9
3 js 44 444 59.5
4 php 55 555 69.9
5 c++ 66 666 75.0
这里我们新建一个 Series 对象用来替换第二列的数据值,通过输出结果可以看到为我们第二列的数据值被修改的结果。
小结:
- 查询数据:
loc ()
查询函数
1.按单个值查询
2.按列表查询
3.按区间查询
4.按条件查询
5.按函数查询
- 增加数据:
1.新增列
直接新增数据列
insert (loc, column, value, allow_duplicates=False)
函数
2.新增行
loc ()
方法新增数据行
append (other, ignore_index=False, verify_integrity=False)
函数
- 删除数据:
1.删除指定行列
drop (labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors=‘raise’)
函数
(删除行或列用labels和axis和inplace参数即可
删除行和列用index 和columns和inplace参数即可)
2.删除特定数据行列
data[data['价格']<50]
- 修改数据:
1.修改索引值
rename (self, mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False, level=None, errors=‘ignore’)
函数
2.修改数据值
修改单个数据值
iat []
函数
修改某类数据值
replace (to_replace=None,value=None……)
函数
修改某区域数据值
loc () 或 iloc ()
函数