欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

sklearn学习笔记 - DataFrame基本操作(一)

程序员文章站 2022-06-03 18:54:04
...

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 类似,现已废弃。

相关标签: DataFrame