索引和列名
索引
建立索引
一般会在建立Dataframe或Series是直接设定索引
obj = pd.Series([4, 7, 9, 10], index=['one', 'two', 'three', 'four'])
obj
'''
one 4
two 7
three 9
four 10
dtype: int64
'''
data = {'stata': ['qwf', 'chiwetena', 'vwe', 'wetwe'],
'pop': [3, 4, 5, 6],
'year': [190, 200, 201, 198]}
data_f = pd.DataFrame(data, index=data['stata']) # 生成的Dataframe会自动分配索引
data_f
'''
pop stata year
qwf 3 qwf 190
chiwetena 4 chiwetena 200
vwe 5 vwe 201
wetwe 6 wetwe 198
'''
##修改索引
data_f.index = data['year']
data_f
'''
pop stata year
190 3 qwf 190
200 4 chiwetena 200
201 5 vwe 201
198 6 wetwe 198
'''
使用索引
两种方式:iloc,loc,前者是下标索引,后者是名字索引
frame = pd.DataFrame(np.arange(12).reshape(4, 3),
index=['one', 'two', 'three', 'four'],
columns=['hoin', 'hui', 'dfs'])
frame
'''
hoin hui dfs
one 0 1 2
two 3 4 5
three 6 7 8
four 9 10 11
'''
print(frame.loc[['one', 'two'], ['hoin', 'hui']])
'''
hoin hui
one 0 1
two 3 4
'''
print(frame.iloc[[1, 2], [0, 1, 2]])
'''
hoin hui dfs
two 3 4 5
three 6 7 8
'''
print(frame.iloc[2]) # 仅取出第3行的数据
'''
hoin 6
hui 7
dfs 8
Name: three, dtype: int32
'''
frame.loc['one']# 仅取出one行的数据
'''
hoin 0
hui 1
dfs 2
Name: one, dtype: int32
'''
print(frame.iloc[:2, [1,2]]) # loc索引切片包含,但是iloc切片索引不包含(索引为连续数据时)
'''
hui dfs
one 1 2
two 4 5
'''
列名
在建立series和Datafram时通过columns字段写入
筛选需要的列
frame_1 = pd.DataFrame(frame,columns=['hoin','dfs'])
frame_1
'''
hoin dfs
one 0 2
two 3 5
three 6 8
four 9 11
'''
修改列名
frame_1.rename(columns={'hoin': 'hoin_11'},inplace=True)
frame_1
'''
hoin_11 dfs
one 0 2
two 3 5
three 6 8
four 9 11
'''
数据格式调整
修改数据类型
frame_1[['hoin_11']] = frame_1[['hoin_11']].astype(str) # 转字符串
print(frame_1.dtypes)
'''
hoin_11 object
dfs int32
dtype: object
'''
修改数据内容
data= pd.DataFrame([[' wf' , ' qwfqw', 'qwf'],['qwf ', 'fff ', ' fqwfasf']],
index=[1,2],
columns=['aaa', 'bbb', 'ccc'])
for i in range(len(data.columns)):
data.iloc[:,i] = data.iloc[:,i].str.strip()
print(data)
'''
aaa bbb ccc
1 wf qwfqw qwf
2 qwf fff fqwfasf
'''
替换字符
data.aaa = data.aaa.replace("qwf","sssss")
print(data)
'''
aaa bbb ccc
1 wf qwfqw qwf
2 sssss fff fqwfasf
'''
排序
data = pd.read_csv("./data.csv",encoding='gbk')
###按索引排序
print(data.head())###正序
print(data.sort_index(ascending=False).head())###倒序
###按列值排序
print(data.sort_values(["身高", "体重" ],ascending=False).head())
数据拼接
行堆叠
concat(objs, axis=0, join=‘outer’, join_axes=None, ignore_index=False,keys=None, levels=None, names=None, verify_integrity=False,copy=True)
参数说明:
- objs: 拼接的series或dataframe
- axis:拼接轴方向,默认为0,沿行拼接;若为1,沿列拼接
- join:默认外联’outer’,拼接另一轴所有的label,缺失值用NaN填充;内联’inner’,只拼接另一轴相同的label;
- join_axes: 指定需要拼接的轴的labels,可在join既不内联又不外联的时候使用
- ignore_index:对index进行重新排序
- keys:多重索引,便于区分来源表
- sort: 按值排序
列拼接
merge(left_data,right_data,on,left_on,right_on,suffixes,how,left_index,right_index)
参数说明:
- left_data/right_data: 需要合并的两部分数据,左右顺序不同,结果有可能不一样,具体要结合how来看
- on: 连接键,当两个表的连接键名一样,可以直接用on,而不用left_on和right_on,可以是单键或多键
- left_on/right_on: 如果两个表键名不一样,则分别指出,可以是单键或多键
- suffixes: 如果两边键名相同的,想要做区分,可以使用此参数指定区分格式,如suffixes=(’_left’, ‘_right’)
- how:指定连接的方式,分为inner,left, right, outer,与SQL中的join一致,默认为Inner
- left_index/right_index: 如果需连接的键是索引,就不用left_on/right_on,而是用这两个,也可以一个用left_on,一个用right_index,两都可结合使用
取值
字典
a={'name':'tony','sex':'male'}
a['name']## 用key不存在时报错
'''
'tony'
'''
a.get('name')##用key不存在时,a.get(‘age’) 不会产生错误,解析器返回值如果存在就返回相应的value, 如果不存在就返回None.
'''
'tony'
'''
Dataframe
抽取 | 方法 | 抽取的数据类型 |
---|---|---|
1行 -‘展昭’ 1 行 | df.loc[‘展昭’] | Series 对象 |
1行 - 第2行 | df.iloc[2] | Series 对象 |
指定多行 - ‘王宽’, ‘展昭’ 2行 | df.loc[[‘王宽’, ‘展昭’] | DataFrame 对象 |
指定多行 - 第1行 和 第2行 | df.iloc[[0, 2] | DataFrame 对象 |
连续多行 - 从’王宽’到’展昭’ 行 | df.loc[‘王宽’:‘展昭’] | DataFrame 对象 |
连续多行 - 从第1行到’雅雅’ 行 | df.loc[:‘雅雅’:] | DataFrame 对象 |
连续多行 - 从第1行到第2行 | df.iloc[0:2] | DataFrame 对象 |
连续多行 - 从第3行到结尾 | df.iloc[2::] | DataFrame 对象 |
1列 - ‘英文’ 1列 | df[[‘英文’]] | DataFrame 对象 |
1列 - ‘英文’ 1列 | df[‘英文’] | Series 对象 |
1列 - "英文"列 | df.loc[:, ‘英文’] | Series 对象 |
1列 - 第1列 | df.iloc[:, [1]] | DataFrame 对象 |
1列 - 第4列 | df.iloc[:, 3] | Series 对象 |
指定多列 - ‘英语’和’语文’ 2列 | df[[‘英文’, ‘语文’]] | DataFrame 对象 |
指定多列 - ‘英语’和’语文’ 2列 | df.loc[:, [‘英文’, ‘语文’]] | DataFrame 对象 |
指定多列 - 第1列 和 第2列 2列 | df.iloc[:, [0, 1]] | DataFrame 对象 |
连续多列 - 从’英文’列到最后1列 | df.loc[:, ‘英文’:] | DataFrame 对象 |
连续多列 - 从第1列到第3列 | df.iloc[:, :3] | DataFrame 对象 |
单元格 - 值 | df.loc[‘王宽’, ‘语文’] | 具体看单元格里的值 |
行列 - '王宽’行,'语文’列 | df.loc[[‘王宽’], [‘语文’]] | DataFrame 对象 |
行列 - '王宽’行,'数学’和’语文’列 | df.loc[[‘王宽’], [‘数学’, ‘语文’]] | DataFrame 对象 |
单元格 - 值 | df.iloc[1, 2] | 具体看单元格里的值 |
行列 - 第2行的第3列 | df.iloc[[1], [2]] | DataFrame 对象 |
连续行列 - 第3列的第2行到最后1行 | df.iloc[1:, [2]] | DataFrame 对象 |
连续行列 - 第2行的第1列和第3列 | df.iloc[1:, [0, 2]] | DataFrame 对象 |
data.aaa,data[‘aaa’],data.loc[:,‘aaa’],data.iloc[:,0]的结果相同,都是aaa列数据,返回Series
data.loc[:,[‘aaa’]],data.iloc[:,[0]]的结果相同,都是aaa列数据,返回DataFrame
Series
import pandas as pd
import numpy as np
s = pd.Series([9, 'zheng', 'beijing', 128, 'usa', 990], index=[1,2,3,'e','f','g'])
print(s)
print(s['f']) # 根据索引找出值,结果:usa,类型为str
'''
str
'''
print(s[4:5]) ##返回类型为Series
'''
f usa
dtype: object
'''
s = {"ton": 20, "mary": 18, "jack": 19, "jim": 22, "lj": 24, "car": None}
sa = pd.Series(s, name="age")
print(sa[sa>19])
'''
jim 22.0
lj 24.0
ton 20.0
Name: age, dtype: float64
'''
print(sa>sa.median())### 判断是否大于中位数
'''
car False
jack False
jim True
lj True
mary False
ton False
Name: age, dtype: bool
'''
array
对于array数据进行切片应注意:1)切片时指定各个维度坐标时,无论位置数量是否为1,都应尽量采用范围表示的形式,以避免产生维度丢失影响后续的计算结果。2)对于不连续切片可采用np.take()函数进行切片,既可实现不连续切片也可以保持矩阵原有的维度。
import numpy as np
a = np.array([1, 2, 3, 4, 5]) # 创建一维数组
print(a)
#>>>array([1, 2, 3, 4, 5]) # 输出一维array,数据外面只有一层方括号‘[]’
# 提取第一个元素
print(a[0])
#>>>1
# 提取最后一个元素
print(a[-1])
#>>>5
# 提取连续范围 第0~2 个元素
print(a[:3])
#>>>[1 2 3]
# 提取第3个以后的元素(包括第3个元素)
print(a[3:])
#>>>[4 5]
# 提取所有元素
print(a[:])
#>>>[1 2 3 4 5]
# 提取任意不连续的元素
print(a.take([1,3,4]))
#>>>[2 4 5]
# 生成2维数组
a=np.arange(10).reshape(2,5)
print(a) # 打印出a
>>>[[0 1 2 3 4]
[5 6 7 8 9]]
# 提取第一行,使用范围切片形式,结果仍为2维
print(a[0:1,:])
>>>[[0 1 2 3 4]]
# 提取第一行中的1,3,4三个位置元素组成的2维数组
print(a.take([0],0))
#>>>[[0 1 2 3 4]]
print(a.take([0],0).shape)
#>>>(1, 5)
print(a.take(0,0).shape)
#>>>(5,)
print(a.take([0],0).take([1,3,4],1))
#>>>[[1 3 4]]