Press "Enter" to skip to content

机器学习——pandas

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

 

一、pandas的数据结构

 

Pandas中一共有三种
数据结构,分别为:Series、DataFrame和MultiIndex
(老版本中叫Panel )。

 

其中Series
是一维
数据结构,DataFrame
是二维
的表格型数据结构,MultiIndex
是三维
的数据结构。

 

1、Series

 

Series是一个类似于一维数组
的数据结构,它能够保存任何类型的数据,比如整数、字符串、浮点数等,主要由一组数据
和与之相关的索引
两部分构成。

 

①Series的创建

 

pd.Series(data=None, index=None, dtype=None)

 

data:传入的数据,可以是字典、list等

 

index:索引,必须是唯一
的,且与数据的长度相等。如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引。

 

dtype:数据的类型

 

pd.Series(np.arange(3))
# 输出
0    0
1    1
2    2
dtype: int32
pd.Series([1, 2, 3], index=[1,2,3])
# 输出
1    1
2    2
3    3
dtype: int64
a3 = pd.Series({
 'red':100, 'blue':200, 'green': 500})
# 输出
red      100
blue     200
green    500
dtype: int64

 

②series的属性

 

为了更方便地操作Series对象中的索引和数据
,Series中提供了两个属性index和values

 

a3.index
# 输出
Index(['red', 'blue', 'green'], dtype='object')
a3.values
# 输出
array([100, 200, 500], dtype=int64)

 

2、DataFrame

 

DataFrame是一个类似于二维数组或表格(如excel)
的对象,既有行索引
,又有列索引

 

行索引,表明不同行,叫index,0轴,axis=0

 

列索引,表明不同列,叫columns,1轴,axis=1

 

① DataFrame的创建

 

pd.DataFrame(data=None, index=None, columns=None)

 

index:行标签。如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引。

 

columns:列标签。如果没有传入索引参数,则默认会自动创建一个从0-N的整数索引。

 

pd.DataFrame(np.linspace(1, 150, 16).reshape((4, 4)))
# 输出,行列标签从0开始
        0        1        2        3
01.00000010.93333320.86666730.800000
140.73333350.66666760.60000070.533333
280.46666790.400000100.333333110.266667
3120.200000130.133333140.066667150.000000
data = pd.DataFrame(np.arange(0, 11, 2).reshape((2, 3)), [3, 4], ['first', 'second', 'third'])
#输出,行标签从3开始,列标签自定义
    first  second  third
3024
46810

 

② DataFrame的属性

 

shape

 

获得DataFrame的形状(行数、列数)

 

data.shape# data定义如上
# 结果
(2, 3)

 

index

 

获得DataFrame的行标签(索引)

 

data.index
# 输出
Int64Index([3, 4], dtype='int64')

 

columns

 

获得DataFrame的列标签

 

data.columns
# 输出
Index(['first', 'second', 'third'], dtype='object')

 

values

 

获得DataFrame的所有值

 

data.values
# 输出
array([[ 0,  2,  4],
       [ 6,  8, 10]])

 

T

 

将DataFrame的转置

 

data.T
# 输出
34
first06
second28
third410

 

head()

 

输出DataFrame的前几条数据,默认为5

 

data.head(1)
# 输出
firstsecondthird
3  0       2  4

 

tail()

 

输出DataFrame的后几条数据,默认为5

 

data.tail(1)
# 输出
firstsecondthird
4  6       8 10

 

③DatatFrame索引的修改

 

datatframe.reset_index(drop=False)

 

设置新的下标索引,drop
默认为False
,意为不删除原来索引
;如果为True
,则删除原来的索引

 

data.reset_index()
# 输出
indexfirstsecondthird
0  3      0      2      4
1  4      6      8      10
data.reset_index(drop = True)
# 输出
firstsecondthird
0  0    2  4
1  6       8  10

 

datatframe.set_index(keys, drop=True)

 

以现有的某列值将其设置为新的索引

 

keys:列索引名或者列表

 

drop:布尔类型,默认为真,删除原来的索引

 

data.set_index(['first'])
# 输出
secondthird
first
0  2  4
6  8  10

 

二、dataframe的基本操作

 

1、df的loc与iloc用法详解

loc函数
:第一个参数取行,第二个参数取列
。取行用行索引值
,取列用列名
,都是前闭后闭
iloc函数
:第一个参数取行,第二个参数取列
。取行用行索号
,取列用列名的下标
,都是前闭后开

注:loc是location
的意思,iloc中的i是integer
的意思,仅接受整数作为参数。

 

data.loc[:3, :'second']# 此时行索引为3,则是第一行
# 输出
firstsecond
3  0       2
data.iloc[:1, :]# 此时的第一行,对应的是行索引为3
# 输出
firstsecondthird
3  0       2  4

 

2、赋值操作

 

data['first'] = 10
# 输出
firstsecondthird
3  10   2  4
4  10   8  10
data.second = 20
# 输出
firstsecondthird
3  10  20  4
4  10  20  10

 

排序有两种形式
,一种对于索引排序
,一种对于内容排序

 

①内容排序

 

df.sort_values(by=, ascending=)

 

对单个键
或者多个键
进行排序

 

by:指定排序参考的键

 

ascending:默认为True,升序
;若为False,则降序

 

data.sort_values(by = ['first'], ascending = False)
# 输出
firstsecondthird
4  6       8  10
3  0       2  4

 

②索引排序

 

data.sort_index(ascending=)

 

data.sort_index(ascending = False)
# 输出
firstsecondthird
4  6       8  10
3  0       2  4

 

4、df.query

 

它是个逻辑运算函数

 

x = pd.DataFrame(np.arange(1, 7, 1).reshape((2, 3)), columns = ['first', 'second', 'sthird'])
print(x)
print(x.query('first > 0 & first < 2'))# 该条语句和下面一条语句等效
print(x[(x['first'] > 0) & (x['first'] < 2)])
# 输出
     first  second  sthird
0      1       2       3
1      4       5       6
     first  second  sthird
0      1       2       3
     first  second  sthird
0      1       2       3

 

5、df.isin

 

判断某列里面是否有某些值
,注意isin里面的参数是列表类型

 

x = pd.DataFrame(np.arange(1, 7, 1).reshape((2, 3)), columns = ['first', 'second', 'sthird'])
print(x)
print(x['second'].isin([1]))
# 输出
     first  second  sthird
0      1       2       3
1      4       5       6
0    False# 这是他的返回值
1    False
Name: second, dtype: bool

 

6、df.describe、max、min、std、var、median、idxmax、idxmin

 

 

df.~解释
describe综合分析
max最大值
min最小值
std标准差
var方差
median中位数
idxmax获得最大值的位置
idxmin获得最小值的位置

 

三、pd读取文件

 

我们的数据大部分存在于文件当中,所以pandas会支持复杂的IO操作,pandas的API支持众多的文件格式,如CSV、SQL、XLS、JSON、HDF5。

 

pandas.read_csv(filepath_or_buffer, sep =‘,’, usecols, names=, header= )

 

filepath_or_buffer:文件路径

 

sep:分隔符,默认用”,”隔开

 

usecols:指定读取的列名,列表形式

 

names:当names没被赋值时,header会变成0;当 names 被赋值,header 没被赋值时,那幺header会变成None。如果都赋值,就会实现两个参数的组合功能。

 

header:设置导入 DataFrame 的列名称,header为0代表先把第一行当做表头

 

names与header的关系主要体现为:

 

 

    1. csv文件有表头并且是第一行

 

    1. ,那幺names

 

    1. 和header

 

    1. 都无需指定

 

    1. ;

 

    1. csv文件有表头、但表头不是第一行

 

    1. ,可能从下面几行开始才是真正的表头和数据,这个时候指定header即可;

 

    1. csv文件没有表头,全部是纯数据

 

    1. ,那幺我们可以通过names手动生成表头;

 

    1. csv文件有表头、但是这个表头你不想用

 

    1. ,这个时候同时指定names和header

 

    1. 。先用header选出表头和数据,然后再用names将表头替换掉,就等价于将数据读取进来之后再对列名进行rename;

 

 

pandas.read_hdf(path_or_buf,key =None,** kwargs)

 

从h5文件当中读取数据
,HDF5文件的读取和存储需要指定一个键
,值为要存储的DataFrame

 

path_or_buffer:文件路径

 

key:读取的键

 

pandas.read_json(path_or_buf=None, orient=None, typ=‘frame’, lines=False)

 

将JSON格式准换成默认的Pandas DataFrame格式

 

path_or_buffer:文件路径

 

orient:

‘split
’:将索引总结到索引,列名到列名,数据到数据。将三部分都分开了
‘records
’:以columns:values
的形式输出
‘index
’ : 以index:{columns:values}
的形式输出
‘columns
’ : 以columns:{index:values}
的形式输出
‘values
’ : 直接输出值

typ:指定转换成的对象类型series或者dataframe

 

lines:按照每行读取json对象

 

四、缺失值处理

 

对nan值的处理

 

①判断数据中是否包含NaN

 

pd.isnull(df)
pd.notnull(df)

 

②删除存在的缺失值

 

df.dropna(axis=‘rows’)

 

注意:这里不会修改原数据,需要接收返回值

 

# 可以定义新的变量接受或者用原来的变量名
data = data.dropna()

 

③替换缺失值

 

df.fillna(value, inplace=True)

 

value:替换成的值

 

inplace:True
则会修改原数据
,False
则不替换修改原数据
,生成新的对象

 

for i in movie.columns:
if np.all(pd.notnull(movie[i])) == False:
print(i)
movie[i].fillna(movie[i].mean(), inplace=True)

 

五、数据离散化

 

数据离散化在处理数据中是重要的一步,有效的离散化能减小算法的时间和空间开销
,提高
系统对样本的分类聚类能力和抗噪声能力

 

连续属性的离散化就是在连续属性的值域上,将值域划分为若干个离散的区间
,最后用不同的符号或整数 值代表落在每个子区间中的属性值。

 

而数据离散化
要分组和one-hot搭配使用

 

pd.qcut(data, q)

 

对数据列进行分组
,一般会与value_counts()(统计分组个数)搭配使用
,返回分好组的数据

 

data:待分组的列

 

q:需要分组的个数

 

x = pd.DataFrame(np.arange(1, 101, 1).reshape((25, 4)), columns = ['first', 'second', 'sthird', 'fourth'])
m = pd.qcut(x['first'], 10)# 分组
m.value_counts()# 计算分到每个组数据个数
# 输出
(0.999, 10.6]    3
(20.2, 29.8]     3
(39.4, 49.0]     3
(68.2, 77.8]     3
(87.4, 97.0]     3
(10.6, 20.2]     2
(29.8, 39.4]     2
(49.0, 58.6]     2
(58.6, 68.2]     2
(77.8, 87.4]     2
Name: first, dtype: int64

 

pd.cut(data, bins)

 

data:待分组的列

 

bins:自定义的分组类型,可以是整型(意思同qcut),或列表类型(表中数据间隔则为分组范围)

 

x = pd.DataFrame(np.arange(1, 101, 1).reshape((25, 4)), columns = ['first', 'second', 'sthird', 'fourth'])
print(x)
m = pd.cut(x['first'], [0, 50, 100])
m.value_counts()
# 输出
(0.904, 49.0]    13
(49.0, 97.0]     12
Name: first, dtype: int64

 

2、one-hot

 

把每个类别生成一个布尔列
,这些列中只有一列可以为这个样本取值为1。其又被称为独热编码。

 

pandas.get_dummies(data, prefix=None)

 

data:分组后的列数据

 

prefix:分组名字的前缀

 

dummies = pd.get_dummies(m, prefix="rise")
print(dummies)

 

输出

 

六、合并

 

如果数据由多张表组成,那幺则需要将这些表合并成一张表

 

1、 pd.concat

 

pd.concat([data1, data2], axis=1)

 

按照行或列进行合并,axis=0为扩展行,axis=1为扩展列

 

# 比如我们将刚才处理好的one-hot编码与原数据合并
pd.concat([x, dummies], axis = 1)

 

输出

 

七、分组与聚合

 

DataFrame.groupby(key, as_index=True)

 

key:分组的列数据,可以多个

 

as_index:若为True则不保留原来的索引,若为False则保留原来的索引

 

一般是指对分组中的数据执行某些操作,比如求平均值、最大值
等,并且会得到一个结果集。

 

col =pd.DataFrame({
 'color': ['white','red','green','red','green'], 'object': ['pen','pencil','pencil','ashtray','pen'],'price1':[5.56,4.20,1.30,0.56
,2.75],'price2':[4.75,4.12,1.60,0.75,3.15]})
print(col)
print(col.groupby(['color'], as_index = False)['price1'].min())
col.groupby(['color'])['price1'].mean()
# 输出
   color   object  price1  price2# 第一个print
0  white      pen    5.56    4.75
1    red   pencil    4.20    4.12
2  green   pencil    1.30    1.60
3    red  ashtray    0.56    0.75
4  green      pen    2.75    3.15
   color  price1# 第二个print,最小值
0  green    1.30
1    red    0.56
2  white    5.56
color# 输出平均值
green    2.025
red      2.380
white    5.560
Name: price1, dtype: float64

 

本文只用于个人学习与记录,侵权立删

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。