本章内容
- Series对象
- DataFrame对象
一、Series
类似于一种一维数组,与ndarray的区别是,Series以ndarray为基础,能够为数据自定义标签,也就是索引(index),通过索引来访问数组。
import pandas as pd
from pandas import Series,DataFrame
import numpy as np
# 一维的数组
sel = Series([1,2,3,4])
print(sel)
'''
0 1
1 2
2 3
3 4
dtype: int64
'''
# 通常我们会自己创建索引
sel = Series(data = [1,2,3,4],index=['a','b','c','d'])
sel = Series(data = [1,2,3,4], index = list('abcd'))
print(sel.values)
'''
[1,2,3,4]
'''
print(sel.index)
'''
Index(['a', 'b', 'c', 'd'], dtype='object')
'''
# 获取索引和值对
print(list(sel.iteritems()))
print(sel)
'''
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
a 1
b 2
c 3
d 4
dtype: int64
'''
# 将字典转换为Series
dict={"red":100,"black":400,"green":300,"pink":900}
se3=Series(dict)
print(se3)
'''
red 100
black 400
green 300
pink 900
dtype: int64
'''
# Series对象同时支持位置和标签两种方式获取数据
print('索引下标',sel['c'])
print('位置下标',sel[2])
'''
索引下标 3
位置下标 3
'''
# 获取不连续的数据
print('索引下标',sel[['a','c']])
print('位置下标',sel[[1,3]])
'''
索引下标 a 1
c 3
dtype: int64
位置下标 b 2
d 4
dtype: int64
'''
# 可以使用切片或取数据
print('位置切片',sel[1:3])# 左包含右不包含
print('索引切片',sel['b':'d'])# 左右都包含
'''
位置切片 b 2
c 3
dtype: int64
索引切片 b 2
c 3
d 4
dtype: int64
'''
# 重新赋值索引的值
sel.index = list('dcba')
print(sel)
'''
d 1
c 2
b 3
a 4
dtype: int64
'''
# ReIndex重新索引,会返回一个新的Series(调用reindex将会重新排序,缺失值则用NaN填补)
result = sel.reindex(['b','a','c','d','e'])
print(result)
'''
b 3.0
a 4.0
c 2.0
d 1.0
e NaN
dtype: float64
'''
# drop丢弃指定轴上的项
se1=pd.Series(range(10,15))
print(se1.drop([2,3]))
'''
0 10
1 11
4 14
dtype: int64
'''
Series的算术运算操作:
'''
Series的运算时基于index的,我们可以用加减乘除对两个series进行计算,pandas会根据index对相应数据进行计算,结果以浮点数形式存储,以免丢失精度。如果在两个Series中找不到相同的index,对应位置会返回一个空值NaN
'''
series1 = pd.Series([1,2,3,4],['London','HongKong','Humbai','lagos'])
series2 = pd.Series([1,3,6,4],['London','Accra','lagos','Delhi'])
print(series1)
print(series2)
print(series1-series2)
print(series1+series2)
print(series1*series2)
'''
London 1
HongKong 2
Humbai 3
lagos 4
dtype: int64
London 1
Accra 3
lagos 6
Delhi 4
dtype: int64
Accra NaN
Delhi NaN
HongKong NaN
Humbai NaN
London 0.0
lagos -2.0
dtype: float64
Accra NaN
Delhi NaN
HongKong NaN
Humbai NaN
London 2.0
lagos 10.0
dtype: float64
Accra NaN
Delhi NaN
HongKong NaN
Humbai NaN
London 1.0
lagos 24.0
dtype: float64
'''
sel = Series(data = [1,6,3,5], index = list('abcd'))
print(sel)
print(sel[sel>3]) # 布尔数组过滤
print(sel*2) # 标量乘法
print(np.square(sel)) # 可以直接加入到numpy的数学函数
'''
a 1
b 6
c 3
d 5
dtype: int64
b 6
d 5
dtype: int64
a 2
b 12
c 6
d 10
dtype: int64
a 1
b 36
c 9
d 25
dtype: int64
'''
二、DataFrame
Dataframe是一个二维的表结构。Pandas的dataframe可以存储许多种不同的数据类型,并且每一个坐标轴都有自 己的标签。你可以把它想象成一个series的字典项。
1、创建DataFrame
使用二维数组ndarray
df1 = DataFrame(np.random.randint(0,10,(4,4)),index=[1,2,3,4],columns=['a','b','c','d'])
print(df1)
'''
a b c d
1 7 3 5 5
2 2 2 5 0
3 0 2 8 6
4 1 7 9 7
'''
使用字典:行索引由index决定,列索引由字典键决定。索引相同的情况下,相同索引的值会相对应,缺失值使用NaN
dict={
'Province': ['Guangdong', 'Beijing', 'Qinghai', 'Fujian'],
'pop': [1.3, 2.5, 1.1, 0.7],
'year': [2018, 2018, 2018, 2018]}
df2=pd.DataFrame(dict,index=[1,2,3,4])
print(df2)
'''
Province pop year
1 Guangdong 1.3 2018
2 Beijing 2.5 2018
3 Qinghai 1.1 2018
4 Fujian 0.7 2018
'''
# 使用from_dict
dict2={"a":[1,2,3],"b":[4,5,6]}
df6=pd.DataFrame.from_dict(dict2)
print(df6)
'''
a b
0 1 4
1 2 5
2 3 6
'''
data = {
'Name':pd.Series(['zs','ls','we'],index=['a','b','c']),
'Age':pd.Series(['10','20','30','40'],index=['a','b','c','d']),
'country':pd.Series(['中国','日本','韩国'],index=['a','c','b'])
}
df = pd.DataFrame(data)
print(df)
dict1 = df.to_dict() # 将df转换为dict
print(dict1)
'''
Name Age country
a zs 10 中国
b ls 20 韩国
c we 30 日本
d NaN 40 NaN
{'Name': {'a': 'zs', 'b': 'ls', 'c': 'we', 'd': nan}, 'Age': {'a': '10', 'b': '20', 'c': '30', 'd': '40'}, 'country': {'a': '中国', 'b': '韩国', 'c': '日本', 'd': nan}}
'''
2、DataFrame常用属性
# dataframe常用属性
df_dict = {
'name':['James','Curry','Iversion'],
'age':['18','20','19'],
'national':['us','China','us']
}
df = pd.DataFrame(data=df_dict,index=['0','1','2'])
print(df)
# 获取行数和列数
print(df.shape)
# 获取行索引
print(df.index.tolist())
# 获取列索引
print(df.columns.tolist())
# 获取数据的类型
print(df.dtypes)
# 获取数据的维度
print(df.ndim)
# 获取数据的值
print(df.values)
# 获取数据的概览
print(df.info())
# 显示头几行,默认显示5行
print(df.head(2))
# 显示后几行
print(df.tail(1))
# 获取DataFrame的列
print(df['name'])
#因为我们只获取一列,所以返回的就是一个 Series
print(type(df['name']))
# 如果获取多个列,那返回的就是一个 DataFrame 类型:
print(df[['name','age']])
print(type(df[['name','age']]))
# 获取一行
print(df[0:1])
# 获取多行
print(df[1:3])
# 取多行里面的多列
print(df[1:3][['name','age']])
'''
df.loc 通过标签索引行数据
df.iloc 通过位置获取行数据
'''
# 获取某一行某一列的数据
print(df.loc['0','name'])
# 获取一行的所有列
print(df.loc['0',:])
# 获取某一行多列
print(df.loc['0',['name','age']])
# 获取不连续的多行多列
print(df.loc[['0','2'],['name','age']])
# 获取连续的多行多列
print(df.loc[['0':'2'],['name','age']])
# 取一行
print(df.iloc[1])
# 取连续多行
print(df.iloc[0:2])
# 取间断的多行
print(df.iloc[[0,2],:])
# 取某一列
print(df.iloc[:,1])
# 取某个值
print(df.iloc[0,1])
# 修改值
df.iloc[0,0] = 'panda'
# DataFrame中的排序
df = df.sort_values(by = 'age',ascending = False) # False为降序,默认为升序
3、修改行索引index、列索引columns
df1 = pd.DataFrame(np.arange(9).reshape(3, 3), index = ['bj', 'sh', 'gz'], columns=['a', 'b', 'c'])
df1.index = ['beijing', 'shanghai', 'guangzhou']
print(df1)
'''
a b c
beijing 0 1 2
shanghai 3 4 5
guangzhou 6 7 8
'''
# 自定义map函数(x是原有的行列值)
def test_map(x):
return x+'_ABC'
print(df1.rename(index=test_map,columns=test_map))
'''
a_ABC b_ABC c_ABC
beijing_ABC 0 1 2
shanghai_ABC 3 4 5
guangzhou_ABC 6 7 8
'''
# 用字典的键值对进行赋值
df = df1.rename(index={'bj':'beijing'},columns={'a':'aa'})
print(df)
# 列转化为索引
df1=pd.DataFrame({'X':range(5),'Y':range(5),'S':list("abcde"),'Z':[1,1,2,2,2]})
print(df1)
'''
X Y S Z
0 0 0 a 1
1 1 1 b 1
2 2 2 c 2
3 3 3 d 2
4 4 4 e 2
'''
# 指定一列为索引,drop=False表示在df中保留该列
result = df1.set_index('S',drop=False)
print(result)
'''
X Y S Z
S
a 0 0 a 1
b 1 1 b 1
c 2 2 c 2
d 3 3 d 2
e 4 4 e 2
'''
4、添加数据
(1) 增加一行一列
# 增加数据
df1 = pd.DataFrame([['Snow','M',22],['Tyrion','M',32],['Sansa','F',18],['Arya','F',14]], columns=['name','gender','age'])
# 在数据框最后加上score一列
df1['score'] = [80,98,67,90] # 增加列的元素个数要跟原数据列的个数一样
print(df1)
'''
name gender age score
0 Snow M 22 80
1 Tyrion M 32 98
2 Sansa F 18 67
3 Arya F 14 90
'''
col_name=df1.columns.tolist() # 将数据框的列名全部提取出来存放在列表里
col_name.insert(2,'city') # 在列索引为2的位置插入一列,列名为:city,刚插入时不会有值,整列都是NaN
df1=df1.reindex(columns=col_name) # DataFrame.reindex() 对原行/列索引重新构建索引值
print(df1)
df1['city']=['北京','山西','湖北','澳门'] # 给city列赋值
print(df1)
'''
name gender city age
0 Snow M 北京 22
1 Tyrion M 山西 32
2 Sansa F 湖北 18
3 Arya F 澳门 14
'''
# 创建一个DataFrame,用来增加进数据框的最后一行
new=pd.DataFrame({'name':'lisa',
'gender':'F',
'age':19
},index=[0])
print(new)
# print("-------在原数据框df1最后一行新增一行,用append方法------------")
df1=df1.append(new,ignore_index=True) # ignore_index=False,表示不按原来的索引,从0开始自动递增
print(df1)
(2)增加多行多列
df1 = pd.DataFrame(np.arange(6).reshape(3,2),columns=['four','five'])
df2 = pd.DataFrame(np.arange(6).reshape(2,3),columns=['one','two','three'])
# 按行合并
result = pd.concat([df1,df2],axis=1)
print(result)
'''
four five one two three
0 0 1 0.0 1.0 2.0
1 2 3 3.0 4.0 5.0
2 4 5 NaN NaN NaN
'''
# 按列合并
result = pd.concat([df1,df2],axis=0,ignore_index=True,sort=False)
print(result)
'''
four five one two three
0 0.0 1.0 NaN NaN NaN
1 2.0 3.0 NaN NaN NaN
2 4.0 5.0 NaN NaN NaN
3 NaN NaN 0.0 1.0 2.0
4 NaN NaN 3.0 4.0 5.0
'''
5、删除数据
df2 = pd.DataFrame(np.arange(9).reshape(3,3),columns=['one','two','three'])
df3 = df2.drop(['one'],axis=1,inplace=True)
print(df3)
'''
None,inplace = True时,无返回值,直接在df2上修改
'''
df3 = df2.drop(['one'],axis=1,inplace=False)
print(df3)
print(df2)
'''
two three
0 1 2
1 4 5
2 7 8
one two three
0 0 1 2
1 3 4 5
2 6 7 8
'''