目录
一、Pandas的对象
1. Pandas的Series对象
- Series和Numpy中array非常类似,相当于是array的改进版,最重要的区别就是Series能够提供显示索引,从而为表结构的行标和列标提供了基础
import numpy as np
import pandas as pd
data = pd.Series([6, 9, 2])
data_1 = np.array([6, 9, 2])
print(data)
print("--------------")
print(data_1)
输出:
0 6
1 9
2 2
dtype: int64
--------------
[6 9 2]
可以看到,series不仅显示了其中包含的元素,同时也显示了元素对应的索引
- Series和array的最显著区别就在于,NumPy 数组通过隐式定义的整数索引获取数值,而 Pandas的Series对象定义时可以使用显式定义的索引指定index与数值关联。 显式索引的定义让 Series 对象拥有了更强的能力
例如,索引不再仅仅是整数,还可以是任意想要的类型。如果需要,完全可以用字符串定义索引
import pandas as pd
# 利用insex参数,在创建series时设置显式索引a b c
data = pd.Series([8, 3, 2], index=['a', 'b', 'c'])
print(data)
print(data['a'])
输出:
a 8
b 3
c 2
dtype: int64
8
-
根据索引的名称来索引序列中的某一个元素,和字典非常类似,
因此,有的时候我们也会称Series为特殊的字典,甚至,我们可以用字典来创建Series对象
import pandas as pd pd.Series({2:'a', 1:'b', 3:'c'}) 输出: 2 a 1 b 3 c dtype: object
2. Pandas的Index对象
-
Series 和 DataFrame 对象都使用便于引用和调整的显式索引。
-
可以将Index 对象看作是一个不可变数组或有序集合(实际上是一个多集,因为 Index 对象可能会包含重复值) ,给Index对象赋值会报错
ind = pd.Index([2, 3, 5, 7, 11]) print(ind) 输出: Int64Index([2, 3, 5, 7, 11], dtype='int64')
3. Pandas的DataFrame对象
-
DataFrame是二维表结构数据的直接表示,是多个Series共同构成的数据结构,同时也是实际使用Pandas过程中最常用的数据结构。
-
DataFrame的创建方式:
-
由Series创建DataFrame
-
由array创建DataFrame
-
利用字典创建DataFrame
这3种创建方式都是利用DataFrame函数来创建DataFrame
df = pd.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
-
二、DataFrame对象的操作
# 在使用之前,需要导入pandas库
import pandas as pd
1. 导入数据
df = pd.DataFrame({"id": [1001, 1002, 1003, 1004, 1005],
"date": pd.date_range('20130102', periods=5),
"city": ['Beijing ', 'SH', ' guangzhou ', 'Shenzhen', 'shanghai'],
"age": [23, 44, 54, 32, 34],
"category": ['100-A', '100-B', '110-A', '110-C', '210-A'],
"price": [1200, np.nan, 2133, 5433, np.nan]},
columns=['id', 'date', 'city', 'category', 'age']) # 自己创建数据框
pd.read_csv(filename) # 从CSV⽂件导⼊数据
pd.read_table(filename) # 从限定分隔符的⽂本⽂件导⼊数据
pd.read_excel(filename) # 从Excel⽂件导⼊数据
pd.read_sql(query,connection_object) # 从SQL表/库导⼊数据
pd.read_json(json_string) # 从JSON格式的字符串导⼊数据
pd.read_html(url) # 解析URL、字符串或者HTML⽂件,抽取其中的tables表格
2. 查看数据
df.head(n) # 查看DataFrame对象的前n⾏
df.tail(n) # 查看DataFrame对象的最后n⾏
df.shape() # 查看⾏数和列数
df.info() # 数据表基本信息(维度、列名称、数据格式、所占空间等)
df.columns() # 查看字段(⾸⾏)名称
df.columns.values.tolist() # 获取列名列表
df.describe() # 查看数值型列的汇总统计
df.dtypes # 每一列数据的格式
df['B'].dtype # 某一列格式
df.isnull().any() # 查看是否有缺失值
df['B'].isnull() # 查看某一列空值
df[df[column_name].duplicated()] # 查看column_name字段数据重复的数据信息
df[df[column_name].duplicated()].count() # 查看column_name字段数据重复的个数
3. 数据提取
- 主要用到的三个函数:loc, iloc和ix。
loc函数按标签值进行提取,iloc按位置进行提取,ix可以同时按标签和位置进行提取。
In[1]: data
Out[1]:
A B C D
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d 12 13 14 15
# 1.用loc、iloc提取行数据
#取索引为'a'的行
data.loc['a']
输出:
A 0
B 1
C 2
D 3
#取第一行数据(索引为'a'的行就是第一行,所以结果相同)
data.iloc[0]
输出:
A 0
B 1
C 2
D 3
# 2.用loc、iloc提取列数据
#取'A'列所有行,多取几列格式为 data.loc[:,['A','B']]
data.loc[:,['A']]
输出:
A
a 0
b 4
c 8
d 12
#取第0列所有行,多取几列格式为 data.iloc[:,[0,1]]
data.iloc[:,[0]]
输出:
A
a 0
b 4
c 8
d 12
# 3. 用loc、iloc提取指定行、指定列数据
#提取index为'a','b',列名为'A','B'中的数据
ata.loc[['a','b'],['A','B']]
输出:
A B
a 0 1
b 4 5
#提取第0、1行,第0、1列中的数据
data.iloc[[0,1],[0,1]]
输出:
A B
a 0 1
b 4 5
# 4. 用loc、iloc提取所有数据
#取A,B,C,D列的所有行
data.loc[:,:]
输出:
A B C D
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d 12 13 14 15
#取第0,1,2,3列的所有行
data.iloc[:,:]
输出:
A B C D
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d 12 13 14 15
# 5. 用loc函数,根据某个数据来提取数据所在的行
#提取data数据(筛选条件: A列中数字为0所在的行数据)
data.loc[data['A']==0]
输出:
A B C D
a 0 1 2 3
# 6. ix
df.ix[[:5],["col1","col2"]] # 返回字段为col1和col2的前5条数据
- 注意:用loc函数的时候,当index相同时,会将相同的Index全部提取出来
4. 数据处理
df.fillna(value=x) # ⽤x替换DataFrame对象中所有的空值
df[column_name].fillna(x) # ⽤x替换column_name列中所有空值
df.dropna() # 删除所有包含空值的⾏
df.dropna(axis=1) # 删除所有包含空值的列
pd.isnull() # 检查DataFrame对象中的空值,并返回⼀个Boolean数组
pd.notnull() # 检查DataFrame对象中的⾮空值,并返回⼀个Boolean数组
df.rename(columns=lambdax:x+1) # 批量更改列名
df.rename(columns={'old_name':'new_ name'}) # 选择性更改列名
df.rename(index=lambdax:x+1) # 批量重命名索引
df['city'].drop_duplicates() # 删除后出现的重复值
df['city'].drop_duplicates(keep='last') # 删除先出现的重复值
df_inner.sort_values(by=['age']) # 按照特定列的值排序
df_inner.sort_index() # 按照索引列排序
df.groupby(col) # 返回⼀个按列col进⾏分组的Groupby对象
df.groupby([col1,col2]) # 返回⼀个按多列进⾏分组的Groupby对象
data.apply(np.mean) # 对DataFrame中的每⼀列应⽤函数np.mean
data.apply(np.max,axis=1) # 对DataFrame中的每⼀⾏应⽤函数np.max
5. 数据表合并
# 数据表合并:merge join append concat
# 将df2中的⾏添加到df1的尾部
df1.append(df2)
# 将df2中的列添加到df1的尾部,值为空的对应⾏与对应列都不要
pd.concat([df1,df2],axis=1,join='inner')
# 对df1的列和df2的列执⾏SQL形式的join,默认按照索引来进⾏合并,如果df1和df2有共同字段时,会报错,可通过设置lsuffix,rsuffix来进⾏解决,如果需要按照共同列进⾏合并,就要⽤到set_index(col1)
df1.join(df2.set_index(col1),on=col1,how='inner')
# 对df1和df2合并,按照col1,⽅式为outer
pd.merge(df1,df2,on='col1',how='outer')
#与 df1.join(df2, how='outer')效果相同
pd.merge(df1,df2,left_index=True,right_index=True,how='outer')
房价中用到:
all_features = pd.concat((train_data.iloc[:, 0:-1], test_data.iloc[:, 0:]))
6. 导出数据
df.to_csv(filename) #导出数据到CSV⽂件
df.to_excel(filename) #导出数据到Excel⽂件
df.to_sql(table_name,connection_object) #导出数据到SQL表
df.to_json(filename) #以Json格式导出数据到⽂本⽂件