文章目录
3.DataFrame数据的查询和编辑
查询【一般都是通过索引来操作的】
1.选取列
通过列索引标签或者属性的方式可以单独获取DataFrame的列数据,返回数据类型为Series。在选取列时不能使用切片的方式,超过一个列名用df[['列名1','列名2']]
#选取列
import pandas as pd
import numpy as np
data = {
'name':['张三','李四','王麻子'],
'age':[21,19,23],
'address':['兰州','上海','北京']
}
df = pd.DataFrame(data)
print(df)
w1 = df['name']
print("以列名取一列数据:\n", w1)
w2 = df[['name','age']]
print("以列名取两份数据:\n", w2)
name age address
0 张三 21 兰州
1 李四 19 上海
2 王麻子 23 北京
以列名取一列数据:
0 张三
1 李四
2 王麻子
Name: name, dtype: object
以列名取两份数据:
name age
0 张三 21
1 李四 19
2 王麻子 23
2.选取行
通过行索引或者行索引位置切片形式获取行数据【从0开始的,左闭右开】。DataFrame提供的head【开头开始】和tail【结尾】可以取连续多行数据,sample可以随机抽取并显示数据
#取行 从0开始的
print('显示前两行:\n', df[:2])
print('显示2行:\n', df[1:2])
#head从第一行取,默认前五行
print(df.head())
print(df.head(1))
#tail默认最后五行 可以带数字取最后的
print(df.tail())
print(df.tail(1))
#sample随机抽取n行显示
print(df.sample(2))
显示前两行:
name age address
0 张三 21 兰州
1 李四 19 上海
显示2行:
name age address
1 李四 19 上海
name age address
0 张三 21 兰州
1 李四 19 上海
2 王麻子 23 北京
name age address
0 张三 21 兰州
name age address
0 张三 21 兰州
1 李四 19 上海
2 王麻子 23 北京
name age address
2 王麻子 23 北京
name age address
2 王麻子 23 北京
1 李四 19 上海
3.读取行和列
切片选取行限制比较大,取单独的几行数据可以采用Pandas提供的iloc和loc方法实现。
用法:DataFrame.loc(行索引位置, 列索引位置)
DataFrame.loc(行索引名称或条件, 列索引名称)
#loc
data = {
'name':['张飞', '孙尚香', '韩信', '貂蝉', '马超'],
'location':['游走', '下路', '打野', '中单', '上单'],
'dynasty':['蜀', '蜀', '战国', '汉', '蜀'],
'year':[1999, 2000, 2020, 2050, 3030]
}
df1 = pd.DataFrame(data, columns=['name','location','dynasty','address','year'],index=['a','b','c','d','e'])
df2 = df1.set_index('dynasty')
print(df2)
print("取name和year两列的数据:\n",df2.loc[:,['name','year']])
print("取汉,战国行中name,year的数据:\n",df2.loc[['汉','战国'],['name','year']])
name location address year
dynasty
蜀 张飞 游走 NaN 1999
蜀 孙尚香 下路 NaN 2000
战国 韩信 打野 NaN 2020
汉 貂蝉 中单 NaN 2050
蜀 马超 上单 NaN 3030
取name和year两列的数据:
name year
dynasty
蜀 张飞 1999
蜀 孙尚香 2000
战国 韩信 2020
汉 貂蝉 2050
蜀 马超 3030
取汉,战国行中name,year的数据:
name year
dynasty
汉 貂蝉 2050
战国 韩信 2020
#iloc [索引0开始]
print("显示前两列:\n", df2.iloc[:, 2])
print("显示第1和第3行的第2列:\n", df2.iloc[[1,3],[0]])
显示前两列:
dynasty
蜀 1999
蜀 2000
战国 2020
汉 2050
蜀 3030
Name: year, dtype: int64
显示第1和第3行的第二列:
name
dynasty
蜀 孙尚香
汉 貂蝉
也可以使用ix方法实现行和列的选择,同时支持索引标签和索引位置取值。
4.布尔选择
用选择符不等于(!=)、与(&)、或(|)
df3 = df2[df2['year'] == 3030]
print(df3,type(df3))#返回dataframe型
df2['name']=='孙尚香'#返回布尔类型
name location year
dynasty
蜀 马超 上单 3030 <class 'pandas.core.frame.DataFrame'>
dynasty
蜀 False
蜀 True
战国 False
汉 False
蜀 False
Name: name, dtype: bool
编辑【提取需要编辑的数据,重新赋值】
1.增加数据
增加一行通过append方法传入字典结构数据即可,增加列时为增加的列赋值即可创建一个新的列,具体给值要对应,不然会报错
#插入一行数据append
#加列并赋值
df1['C'] = 10
df1['age'] = [24,33,19,40,80]
data1 = {
'name':'李白',
'location':'打野',
'dynasty':'唐',
'year':'1909'
}
df1.append(data1,ignore_index=True)
name location dynasty year C age
0 张飞 游走 蜀 1999 10 24
1 孙尚香 下路 蜀 2000 10 33
2 韩信 打野 战国 2020 10 19
3 貂蝉 中单 汉 2050 10 40
4 马超 上单 蜀 3030 10 80
name location dynasty year C age
0 张飞 游走 蜀 1999 10.0 24.0
1 孙尚香 下路 蜀 2000 10.0 33.0
2 韩信 打野 战国 2020 10.0 19.0
3 貂蝉 中单 汉 2050 10.0 40.0
4 马超 上单 蜀 3030 10.0 80.0
5 李白 打野 唐 1909 NaN
2.删除数据
删除数据直接用drop方法,行列数据通过axis参数设置默认为0删除行,1删除列。默认数据删除不修改原数据,如果在原数据上删除加入参数inplace=True即可。
#删除数据的行和列 没有指定inplace=True,删除不是在原数据上操作的
df1.drop('C',axis=1)
print(df1)
name location dynasty year C age
0 张飞 游走 蜀 1999 10 24
1 孙尚香 下路 蜀 2000 10 33
2 韩信 打野 战国 2020 10 19
3 貂蝉 中单 汉 2050 10 40
4 马超 上单 蜀 3030 10 80
df1.drop('C',axis=1,inplace=True)
print(df1)
name location dynasty year age
0 张飞 游走 蜀 1999 24
1 孙尚香 下路 蜀 2000 33
2 韩信 打野 战国 2020 19
3 貂蝉 中单 汉 2050 40
4 马超 上单 蜀 3030 80
3.修改数据
对选择的数据进行赋值就可以了。**修改数据是对DataFrame值的修改,无法撤销。**如新列赋值。