sklearn学习笔记 - DataFrame基本操作(一)
目录
1. 什么是DataFrame
与R语言中的数据框frame相似,是将数据存储在二维矩阵中的方法。
由于其可以储存各种类型的数据(bool, int, float, date, string…),因而在数据分析中被广泛应用。
2. 创建DataFrame
2.1 直接创建
import pandas as pd
df = pd.DataFrame([['a', 'b'], ['c', 'd']],
index=['row_1', 'row_2'],
columns=['col_1', 'col_2'])
print(df)
print(type(df))
输出结果为:
col_1 col_2
row_1 a b
row_2 c d
<class 'pandas.core.frame.DataFrame'>
index & columns可以省略,缺省第二个参数为index,第三个参数为columns。
index & columns为可选参数。如果缺失,则默认为从0开始的整数。
Numpy.array可以直接转换成DataFrame。
import numpy as np
df2 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(df2)
输出结果为:
0 1 2
0 1 2 3
1 4 5 6
2 7 8 9
2.2 读取文件
2.2.1 csv
df1 = pd.read_csv(csv_path)
Comma Separated Value,默认分隔符为’,’,可以通过 sep= 更改。
通过 header= 修改表头,默认header=0,即第一行。
如果设置 header=None,则可以使用 names= 设置表头,默认为None。
2.2.2 Excel
df2 = pd.read_excel(excel_path)
与csv不同,read_excel无法自定义分隔符,只能读取excel样式的数据。
2.2.3 table
df3 = pd.read_table(table_path)
该方法与read_csv几乎完全相同,除了默认分隔符 sep=’\t’(Tab)。
2.3 数据类型
2.3.1 查看数据类型
每一列的类型可以使用 df.dtypes 进行查看。
使用 df.info() 除了可以看到每一列的类型,还可以看到每一列非空数据的条数、索引信息和占用内存大小。
2.3.2 astype()
若需要强制转换数据类型,如果保证数据是干净的,可以使用astype()
df['target_column'] = df['target_column'].astype('int')
df['target_column_2'] = df['target_column_2'].astype('object')
可以将名为’target_column’的列中所有的值转为int类型,将名。为’target_column_2’的列中所有的值转为object类型(字符串)。
2.3.3 to_numeric()
df['target_column'] = pd.to_numeric(df['target_column'], errors='raise')
to_numeric可以强制将数据转换为int或float类型的值,具体类型视数据而定。
此方法可以通过设置 errors= 处理无法转换的数据。缺省为 errors=‘raise’,即遇到无法转换的数据时报错。
df['target_column'] = pd.to_numeric(df['target_column'], errors='coerce')
df['target_column'] = pd.to_numeric(df['target_column'], errors='ignore')
errors=‘coerce’ 时无法转换的数据将变为NaN
errors=‘ignore’ 时无视非法数据。后续使用仍可能出错,需要注意。
3. 读取行列信息
3.1 行列数
df.shape
该属性返回一个元组。第一位为行数,第二位为列数。
num_rows = df.shape[0]
num_cols = df.shape[1]
num_rows 与 num_cols 分别储存行数与列数
num_rows = len(df.index)
num_cols = len(df.columns)
此方法亦可,但效率不如 df.shape,数据量大时需注意。
3.2 行列名
df.columns.values
类型为 numpy.ndarray。该属性包含所有列名。
若需要返回列表,则可以用 tolist()进行转换。
df.columns.values.tolist()
获取行名的方法与获取类名类似。
df.index.values
df.index.values.tolist()
可以通过直接修改 df.columns 与 df.index 修改行列名。
df.columns = list(column_array)
df.index = index_list
3.3 选取特定的行列
3.3.1 列
pd.DataFrame(df, columns=['col_1'])
df[['col_1']]
df.col_1
df.loc[:, 'col_1']
df.iloc[:, 0]
五个方法均返回名为 ‘col_1’ 的第一列数据。
前两个方法返回 pandas.core.frame.DataFrame,
后三个方法返回 pandas.core.series.Series .
df[[‘col_1’]] 使用字典属性,可以一次性输出多列;df.col_1 使用点属性,一次仅能输出一列。此二方法均不适用于获取行数据。
loc中只能使用列名,iloc只能使用列的序号。部分教程使用 ix,既可以使用列名,也可以使用序号,但此方法已废弃。
使用iloc时需注意:与R语言不同,此处下标循python惯例,从0开始。
3.3.2 行
pd.DataFrame(df, rows=['row_1'])
df.loc['row_1', :]
df.iloc[0, :]
三个方法均可以返回名为 ‘row_1’ 的第一行数据。
与返回列数据的方法类似,第一个方法返回格式为 DataFrame ,
后二个返回格式为 Series .
额外的,行数据可以使用bool判断:
df[df.col_1=='a']
df.loc[df['col_1']=='a']
将返回所有 col_1 列值为 ‘a’ 的行数据。
不可以使用 iloc ,因为 iloc 的参数只允许使用序号。
3.3.3 单元格
获取特定单元格的方式可以通过组合获取行列数据的方法得到:
pd.DataFrame(df, rows=['row_1'], columns=['col_1', 'col_2'])
df.loc[['row_1'], ['col_1', 'col_2']]
df.iloc[0, [0, 1]]
三个方法均可以返回行名为 ‘row_1’ (第一行),列名为 ‘col_1’ 和 ‘col_2’ (第一列和第二列)的数据。
同样的,第一个方法返回格式为 DataFrame , 第二个返回格式为 Series .
若 df.loc 写作如下格式:
df.loc['row_1', 'col_1']
将定位到单个单元格,返回结果将为object类型。
若目标确定为单个单元格,可以使用 at,iat:
df.at['row_1', 'col_1']
df.iat[0, 0]
结果将返回列名为 ‘col_1’ ,行名为 ‘row_1’ 的第一行第一列单元格的数据,效率较 loc,iloc 更高
数据类型取决于数据本身的类型。
部分教程上使用 get_value 方法。该方法与 at 类似,现已废弃。