概述
此博客将会持续更新,会将numpy、pandas、matplotlib等库进行函数解释,以及示例演示.
这博客更像是一个笔记,让你在某些函数记不住的时候来查一下,而不是一本书一样,给你详细的讲解
附上官方文档地址
数据
所使用的数据集将从下列作为目标使用,可以用这些数据自己实验
数据1.1
[
['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '是'],
['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '是'],
['乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '是'],
['青绿', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '是'],
['浅白', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '是'],
['青绿', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '是'],
['乌黑', '稍蜷', '浊响', '稍糊', '稍凹', '软粘', '是'],
['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '硬滑', '是'],
['乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '硬滑', '否'],
['青绿', '硬挺', '清脆', '清晰', '平坦', '软粘', '否'],
['浅白', '硬挺', '清脆', '模糊', '平坦', '硬滑', '否'],
['浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘', '否'],
['青绿', '稍蜷', '浊响', '稍糊', '凹陷', '硬滑', '否'],
['浅白', '稍蜷', '沉闷', '稍糊', '凹陷', '硬滑', '否'],
['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '否'],
['浅白', '蜷缩', '浊响', '模糊', '平坦', '硬滑', '否'],
['青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑', '否']
]
labels=['色泽', '根蒂', '敲声', '纹理', '脐部', '触感', '结果']
pandas
数据总览
pd.DataFrame.describe()
pd.DataFrame.info()
dtypes:
返回一个Series类型的数据,显示不同列对应的相应类型
示例
col_name col_type
0 Id int64
1 MSSubClass int64
2 MSZoning object
3 LotFrontage float64
4 LotArea int64
#以上为例子
#将object类型的列分离出来
obj_li = []
num_li = []
for i in range(df.shape[0]):
if df.loc[i]['col_type'] == 'object':
obj_li.append(df.lov[i]['col_name'])
else:
obj_li.append(df.lov[i]['col_name'])
类型转变
将某列的类型进行转变
to_numeric
pandas.to_numeric(arg, errors='raise', downcast=None)
将参数转变为numeric类型
>>>s = pd.Series(['1.0', '2', -3])
>>>pd.to_numeric(s)
0 1.0
1 2.0
2 -3.0
astype
DataFrame.astype(dtype, copy=True, errors='raise')
删除
Dataframe.drop(self, labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')
参数
- labels:指定删除行列的名字
- axis:默认为0,指删除行,1为删除列
- index:指定删除行
- columns:指定删除列
- inplace:是否将变量修改,默认并不会修改原变量值
举例
- 删除某行,默认是删除行
>df.drop(labels=行名)
>df.drop(index=行名)
>df.drop(行名)
- 删除某列
> df.drop(列名,axis=1)
> df.drop(columns=列名)
索引
- set_index
作用:将某列设置单索引和符合索引
DataFrame.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)
参数
- append:添加新索引
- drop:False则会保留旧索引到新列中,True则会删除旧的索引
- inplace:是否将变量进行修改
- reset_index
作用:还原索引,将index变为列
```DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill=”) ```
参数
- level:控制了具体要还原的那个等级的索引
- drop:False则索引列会被还原为普通列,True将索引丢掉
- inplace:修改变量
In [318]: data
Out[318]:
c d
a b
bar one z 1.0
two y 2.0
foo one x 3.0
two w 4.0
In [319]: data.reset_index()
Out[319]:
a b c d
0 bar one z 1.0
1 bar two y 2.0
2 foo one x 3.0
3 foo two w 4.0
数据切分
-
pd.cut
按值的大小均匀切分,每组区间大小相同但样本数可能不同
pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise', ordered=True)
参数
- x:目标输入值
- bins:数据类型,设置划分的组数或者指定组局
- int
- sequence
- IntervalIndex
- retbins:bool,default=False,为True时额外返回bins,即每个边界值
- labels:array 或 bool,默认为None。传入数据时,分组的名称由label指示;传入为False时则仅显示分组下标
- precision:精度,默认为3
是否选择返回bins,根据示例查看区别
示例
- bins为int类型,将x划分为bins段
>>>pd.cut(np.array([1, 7, 5, 4, 6, 3]), 3)
#这是将x中每个值转化到对应的分段中
[(0.994, 3.0], (5.0, 7.0], (3.0, 5.0], (3.0, 5.0], (5.0, 7.0], (0.994, 3.0]]
#根据bins将x的范围进行划分为bins段
Categories (3, interval[float64]): [(0.994, 3.0] < (3.0, 5.0] < (5.0, 7.0]]
- 设置retbins=True
>>> pd.cut(np.array([1, 7, 5, 4, 6, 3]), 3,retbins=True)
([(0.994, 3.0], (5.0, 7.0], (3.0, 5.0], (3.0, 5.0], (5.0, 7.0], (0.994, 3.0]]
Categories (3, interval[float64]): [(0.994, 3.0] < (3.0, 5.0] < (5.0, 7.0]],
array([0.994, 3. , 5. , 7. ]))
-
pd.qcut
按照样本在在值上的分布频率进行切分,每组样本数相同,但是划分区间可能不同
pandas.qcut(x, q, labels=None, retbins=False, precision=3, duplicates='raise')
参数
-
x:ndarray或Series
-
q:指示划分的组数,q一般小于len(x)并且被x整除
-
labels:array 或 bool,默认为None。当传入数组时,分组的名称由label指示,当传入False时,仅显示分组下标
-
retbins:bool,默认为False,当为True是,额外返回bins,即每个边界值
-
precision:int,精度,默认为3
- float类型的list
示例
>>>pd.qcut(range(5), 4)
[(-0.001, 1.0], (-0.001, 1.0], (1.0, 2.0], (2.0, 3.0], (3.0, 4.0]]
Categories (4, interval[float64]): [(-0.001, 1.0] < (1.0, 2.0] ...
>>>pd.qcut(range(5), 3, labels=["good", "medium", "bad"])
[good, good, medium, bad, bad]
Categories (3, object): [good < medium < bad]
>>>pd.qcut(range(5), 4, labels=False)
array([0, 0, 1, 2, 3])
统计数目
-
value_counts
返回一个Series类型数据
对一维的数据进行统计,迭代类型都可以
value_counts( values, sort: bool = True, ascending: bool = False, normalize: bool = False, bins=None,dropna: bool = True,)
In [9]: pd.value_counts(df['触感'])
Out[9]:
硬滑 12
软粘 5
Name: 触感, dtype: int64
In [10]: pd.value_counts([1,2,3,4,2])
Out[10]:
2 2
4 1
3 1
1 1
dtype: int64
In [11]: res = pd.value_counts([1,2,3,4,2])
In [12]: type(res)
Out[12]: pandas.core.series.Series
2.mode
DataFrame.mode(axis=0, numeric_only=False, dropna=True)
Get the mode(s) of each element along the selected axis.:对某个轴进行统计,即为行或者列
统计出现次数最多的value,可出现多个值
其他
-
factorize
将对象进行编码,将其编辑为enumerate或者为categorical variable
pandas.factorize(values, sort=False, na_sentinel=- 1, size_hint=None)[source]
- values:转换的对象
- sort:是否排序
- na_sentinel =
- pd.get_dummies(df,drop_first=True)
合并、拼接
- pd.concat
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)
沿着一条轴将多个对象对堆叠到一起
参数
- objs:需要进行连接的对象,[obj1,obj2]
- axis:axis=0,表示在水平方向(row)上进行连接;axis=1表示在垂直方向(column)进行连接
- join:outer表示index全部需要,inner表示只取index重合的部分
- join_axes:传入需要保留的index
- ignore_index:忽略需要连接的frame本身的index。当原本的index没有特别意义的时候可以使用
- keys:可以给每个需要连接的df一个label
示例
- 合并两个Series
>>>s1 = pd.Series(['a', 'b'])
>>>s2 = pd.Series(['c', 'd'])
>>>pd.concat([s1, s2],axis=0)
0 a
1 b
0 c
1 d
>>>pd.concat([s1,s2].axis=1)
0 a c
1 b d
dtype: object
- 设置ignore_index属性为True
>>>pd.concat([s1,s2],ignore_index=True)
0 a
1 b
2 c
3 d
dtype: object
- 添加一个分层的index
>>>pd.concat([s1, s2], keys=['s1', 's2'])
s1 0 a
1 b
s2 0 c
1 d
dtype: object
-
merge
通过键拼接列,可以根据一个或多个键将不同的DataFrame的行连接起来
pandas.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes='_x', '_y', copy=True, indicator=False, validate=None)
参数
- left,right:要合并的两个DataFrame对象
- on:指的是合并(连接)的方式,由inner(内连接),left(左外连接),right(右外连接),outer(全外连接),默认为inner
- left_on,right_on:选择将left对象和right对象进行合并时根据的列值
示例
>>>df1 = pd.DataFrame({'lkey': ['foo', 'bar', 'baz', 'foo'],
'value': [1, 2, 3, 5]})
>>>df2 = pd.DataFrame({'rkey': ['foo', 'bar', 'baz', 'foo'],
'value': [5, 6, 7, 8]})
>>>df1
lkey value
0 foo 1
1 bar 2
2 baz 3
3 foo 5
>>>df2
rkey value
0 foo 5
1 bar 6
2 baz 7
3 foo 8
>>>df1.merge(df2, left_on='lkey', right_on='rkey')
lkey value_x rkey value_y
0 foo 1 foo 5
1 foo 1 foo 8
2 foo 5 foo 5
3 foo 5 foo 8
4 bar 2 bar 6
5 baz 3 baz 7
-
pd.join
拼接列,主要用于索引上的合并
join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False)
参数
转置,颠倒
将原来的index与column进行交换
>>> x1 = {1: 106, 2: 3, 7: 42}
>>> a = x1.keys()
>>> b = x1.values()
>>> df = pd.DataFrame([a,b],index=['type', 'cnt'])#创建dataframe
>>> df2 = pd.DataFrame(df.values.T, index=df.columns, columns=df.index)#转置
>>> print(df)
0 1 2
type 1 2 7
cnt 106 3 42
>>> print(df2)
type cnt
0 1 106
1 2 3
2 7 42
>>>
numpy
排序
-
np.argsort(x)
官方文档对值进行排序,但是返回值对应的index,默认从小到大
参数
- a:array_like
- axis:
- kind:{“quicksort”,“mergesort”,“heapsort”,“stable”}
- 选择排序算法
示例
>>>x = np.array([3, 1, 2])
>>>np.argsort(x)
array([1, 2, 0])
- np.sort(x)
对x的值进行排序
扩展
对numpy.array类型添加一列
np.insert
numpy.insert(arr, obj, values, axis=None)
从示例中即可明白各个参数
参数
- values:设置添加的值
- axis:axis=0,在行上添加,axis=1,在列上添加
- arr:在arr上进行添加
- obj:这是设置添加的位置
>>>a = np.array([[1, 1], [2, 2], [3, 3]])
>#在a上第0列添加
>>>np.insert(a,0,values=1,axis=1)
array([[0, 1, 1],
[0, 2, 2],
[0, 3, 3]])
numpy.hstack
在行上进行扩展,
示例
>>>a = np.array((1,2,3))
>>>b = np.array((2,3,4))
>>>np.hstack((a,b))
array([1, 2, 3, 2, 3, 4])
>>>a = np.array([[1],[2],[3]])
>>>b = np.array([[2],[3],[4]])
>>>np.hstack((a,b))
array([[1, 2],
[2, 3],
[3, 4]])
numpy.vstack
其他
clip
numpy.clip(a, a_min, a_max, out=None, **kwargs)
clip官方文档
参数
- a:array-like
- a_min:设置下限,若是小于这个值的都被设置为a_min
- a_max设置上限,大于a_max则变为a_max
- out:ndarry,选填
示例
a = np.arange(10)
np.clip(a, 1, 8)
array([1, 1, 2, 3, 4, 5, 6, 7, 8, 8])
a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.clip(a, 3, 6, out=a)
array([3, 3, 3, 3, 4, 5, 6, 6, 6, 6])
a = np.arange(10)
a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.clip(a, [3, 4, 1, 1, 1, 4, 4, 4, 4, 4], 8)
array([3, 4, 2, 3, 4, 5, 6, 7, 8, 8])