pandas学习笔记

异常值检测和过滤
使用 describe() 函数查看每一列的描述性统计

count 列的元素的个数

mean 平均值

std 标准方差,描述数据的波动,离散程度

min 最小

max 最大

数据小于标准方差的四倍,认为数据是有意义的

DataFrame.info()

这个函数可以输出读入表格的一些具体信息。这对于加快数据预处理非常有帮助。

独热编码实现方法比较

1、pandas自带的get_dummies()【适合含有字符串类型的数据】
当频繁出现的几个独立变量时,可以使用pandas.get_dummies( )将定性变量转换为 Dummy 变量

好处: * 1.本身就是 pandas 的模块,所以对 DataFrame 类型兼容很好.
* 2.无论你的列是字符型还是数字型都可以进行二值编码.
* 3.能根据用户指定,自动生成二值编码后的变量名.
1 传入Series

import pandas as pd
list1 = pd.Series(list('abcaa'))
dummies_list = pd.get_dummies(list1)
dummies_list

结果:

	a	b	c
0	1	0	0
1	0	1	0
2	0	0	1
3	1	0	0
4	1	0	0

传入DataFrame

df = pd.DataFrame({'A': ['a', 'b', 'a'], 'B': ['b', 'a', 'c'], 'C': [1, 2, 3]})
print(df)
dummies_df = pd.get_dummies(df, prefix = ['col1', 'col2'])
dummies_df

结果:

   A  B  C
0  a  b  1
1  b  a  2
2  a  c  3
    C	col1_a	col1_b	col2_a	col2_b	col2_c
0	1	   1	  0	 	  0		 1		  0
1	2	   0	  1		  1  	 0	 	  0
2	3	   1	  0		  0		 0	 	  1

问题:get_dummies 没有sklearn 的 transformer方法,所以一旦测试集中出现了训练集未曾出现过的特征取值,简单地对测试集、训练集都用 get_dummies 方法将导致数据错误。 也无法像 sklearn 的transformer一样可以输入到pipeline中 进行流程化地机器学习过程。

2、sklearn的OneHotEncoder()【适合只含数值型的数据】

通过 OneHotEncoder() 自带的 feature_indices_ 可以知道哪几列对应哪个原来的特征

使用 numpy.hstack() 将多次结果拼接起来得到变换后的结果

问题:不能直接编码字符串类型数据(LabelEncoder() + OneHotEncoder() 可实现,但需数据格式转换)

print(df.isnull().any()) #用来判断某列是否有缺失值

df.isnull().all() #用来判断某列是否全部为空值

df.isnull().sum() #直接告诉我们每列缺失值的数量。

Pandas.factorize( )

当有多个变量出现时,可以使用pandas.factorize( )创建一些数字,来表示类别变量,对每一个类别映射一个ID,这种映射最后只生成一个特征,不像dummy那样生成多个特征。
factorize()函数可以将Series中的标称型数据映射称为一组数字,相同的标称型映射为相同的数字。factorize函数的返回值是一个tuple(元组)元组中包含两个元素。第一个元素是一个array,其中的元素是标称型元素映射为的数字;第二个元素是Index类型,其中的元素是所有标称型元素,没有重复。

print(pd.factorize(pd.Series(list('abcaadedffg'))))
df = pd.DataFrame({"id":[1,2,3,4,5,6,3,2], "raw_grade":['a', 'b', 'b', 'a', 'a', 'e','c','a']})
df
x = pd.factorize(df.raw_grade)
x

结果:

(array([0, 1, 2, 0, 0, 3, 4, 3, 5, 5, 6]),
 Index(['a', 'b', 'c', 'd', 'e', 'f', 'g'], dtype='object'))
	id	raw_grade
0	1	a
1	2	b
2	3	b
3	4	a
4	5	a
5	6	e
6	3	c
7	2	a

(array([0, 1, 1, 0, 0, 2, 3, 0]), Index(['a', 'b', 'e', 'c'], dtype='object'))

Pandas.Categorical()

categorical 是计算一个列表型数据中的类别数,即不重复项,它返回的是一个CategoricalDtype 类型的对象,相当于在原来数据上附加上类别信息 ,具体的类别和对应的序号可以通过 categories 和 codes来查看
pd.Categorical( list ).codes 可以直接得到原始数据的对应的序号列表,通过这样的处理可以将类别信息转化成数值信息

import pandas as pd

ss = ['a','a','b','c','c']
ss = pd.Categorical(ss)
print(ss, '\n')
print('ss.dtype:', ss.dtype, 'ss.codes:', ss.codes, 'ss.categories:', ss.categories)

结果:

[a, a, b, c, c]
Categories (3, object): [a, b, c] 

ss.dtype: category ss.codes: [0 0 1 2 2] ss.categories: Index(['a', 'b', 'c'], dtype='object')

pd.qcut(x,q[,labels,retbins,precision])

qcut是根据这些值的频率来选择箱子的均匀间隔,即每个箱子中含有的数的数量是相同的。
x:ndarray或Series
q:必须的参数
precision: int,精度,默认为3
传入q参数:指示划分的组数

factors = np.random.randn(9)
print(pd.qcut(factors, 3))  #返回每个数对应的分组
pd.qcut(factors, 3).value_counts() #计算每个分组中含有的数的数量

结果

[(1.061, 2.774], (1.061, 2.774], (-1.464, -0.349], (-0.349, 1.061], (1.061, 2.774], (-0.349, 1.061], (-1.464, -0.349], (-1.464, -0.349], (-0.349, 1.061]]
Categories (3, interval[float64]): [(-1.464, -0.349] < (-0.349, 1.061] < (1.061, 2.774]]

(-1.464, -0.349]    3
(-0.349, 1.061]     3
(1.061, 2.774]      3
dtype: int64

传入label参数:array或bool,默认为None。当传入数组时,分组的名称由label指示;当传入Flase时,仅显示分组下标

print(pd.qcut(factors, 3,labels=["a","b","c"]))#返回每个数对应的分组,但分组名称由label指示
pd.qcut(factors, 3,labels=False) #返回每个数对应的分组,但仅显示分组下标

结果

[c, c, a, b, c, b, a, a, b]
Categories (3, object): [a < b < c]
array([2, 2, 0, 1, 2, 1, 0, 0, 1])

传入retbins参数:bool,是否返回bins,默认为False。当传入True时,额外返回bins,即每个边界值。

pd.qcut(factors, 3,retbins=True)# 返回每个数对应的分组,且额外返回bins,即每个边界值

结果:

([(-0.518, 0.387], (0.387, 1.449], (-0.927, -0.518], (0.387, 1.449], (-0.518, 0.387], (-0.518, 0.387], (-0.927, -0.518], (0.387, 1.449], (-0.927, -0.518]]
 Categories (3, interval[float64]): [(-0.927, -0.518] < (-0.518, 0.387] < (0.387, 1.449]],
 array([-0.92646072, -0.51765899,  0.38652167,  1.44850209]))

pd.cut(x,bins[,labels,retbins,precision])

cut将根据值本身来选择箱子均匀间隔,即每个箱子的间距都是相同的
x: array,仅能使用一维数组, ndarray or Series
bins: integer或sequence of scalars,指示划分的组数或指定组距
labels:array或bool,默认为None。当传入数组时,分组的名称由label指示;当传入Flase时,仅显示分组下标
retbins: bool,是否返回bins,默认为False。当传入True时,额外返回bins,即每个边界值。
precision: int,精度,默认为3

pd.cut(factors, 3) #返回每个数对应的分组

结果:

[(0.732, 2.154], (-0.69, 0.732], (0.732, 2.154], (-0.69, 0.732], (-2.117, -0.69], (0.732, 2.154], (-0.69, 0.732], (-0.69, 0.732], (0.732, 2.154]]
Categories (3, interval[float64]): [(-2.117, -0.69] < (-0.69, 0.732] < (0.732, 2.154]]

pd.cut(factors, bins=[-3,-2,-1,0,1,2,3])

结果:

[(-1, 0], (0, 1], (0, 1], (0, 1], (-1, 0], (1, 2], (0, 1], (0, 1], (-1, 0]]
Categories (6, interval[int64]): [(-3, -2] < (-2, -1] < (-1, 0] < (0, 1] < (1, 2] < (2, 3]]
pd.cut(factors, 3).value_counts() #计算每个分组中含有的数的数量
(-0.969, -0.122]    3
(-0.122, 0.723]     4
(0.723, 1.567]      2
dtype: int64

传入label参数:

 print(pd.cut(factors, 3,labels=["a","b","c"])) #返回每个数对应的分组,但分组名称由label指示
  pd.cut(factors, 3,labels=False) #返回每个数对应的分组,但仅显示分组下标

结果:

[a, b, c, b, a, c, b, b, a]
Categories (3, object): [a < b < c]

array([0, 1, 2, 1, 0, 2, 1, 1, 0])

传入retbins参数:

pd.cut(factors, 3,retbins=True)# 返回每个数对应的分组,且额外返回bins,即每个边界值

结果:

([(-0.969, -0.122], (-0.122, 0.723], (0.723, 1.567], (-0.122, 0.723], (-0.969, -0.122], (0.723, 1.567], (-0.122, 0.723], (-0.122, 0.723], (-0.969, -0.122]]
 Categories (3, interval[float64]): [(-0.969, -0.122] < (-0.122, 0.723] < (0.723, 1.567]],
 array([-0.96897151, -0.12192407,  0.72258982,  1.56710371]))

re.findall() 坑:捕获分组和非捕获分组

在正则表达式前面加上?:可以将捕获分组变成非捕获分组
详细参考 https://blog.csdn.net/qq_39021458/article/details/82429978

数据聚合groupby和分组运算transform,apply

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:Series,DataFrame或Panel对象的序列或映射。如果传递了dict,则排序的键将用作键参数,除非它被传递,在这种情况下,将选择值(见下文)。任何无对象将被静默删除,除非它们都是无,在这种情况下将引发一个ValueError。
axis:{0,1,...},默认为0。沿着连接的轴。
join:{'inner','outer'},默认为“outer”。如何处理其他轴上的索引。outer为联合和inner为交集。
ignore_index:boolean,default False。如果为True,请不要使用并置轴上的索引值。结果轴将被标记为0,...,n-1。如果要连接其中并置轴没有有意义的索引信息的对象,这将非常有用。注意,其他轴上的索引值在连接中仍然受到尊重。
join_axes:Index对象列表。用于其他n-1轴的特定索引,而不是执行内部/外部设置逻辑。
keys:序列,默认值无。使用传递的键作为最外层构建层次索引。如果为多索引,应该使用元组。
levels:序列列表,默认值无。用于构建MultiIndex的特定级别(唯一值)。否则,它们将从键推断。
names:list,default无。结果层次索引中的级别的名称。
verify_integrity:boolean,default False。检查新连接的轴是否包含重复项。这相对于实际的数据串联可能是非常昂贵的。
copy:boolean,default True。如果为False,请勿不必要地复制数据。

pandas map(),apply(),applymap()区别

map()方法

通过df.(tab)键,发现df的属性列表中有apply() 和 applymap(),但没有map().

map()是python 自带的方法, 可以对df某列内的元素进行操作,

import pandas as pd
toward_dict = {'1': '东', '2': '南', '3': '西', '4': '北'}
df = pd.DataFrame({'house' : list('AABCEFG'),
                   'price' : [100, 90, '', 50, 120, 150, 200],
                   'toward' : ['1','1','2','3','','3','2']})
print(df)
df['towarddd'] = df.toward.map(toward_dict)
print(df)

结果

	house	price	toward
0		A		100	  1
1		A		90	  1
2		B			  2
3		C		50	  3
4		E		120	
5		F		150   3
6		G		200	  2

	house	price	toward	towarddd
0		A		100		1		东
1		A		90		1		东
2		B				2		南
3		C		50		3		西
4		E		120				NaN
5		F		150		3		西
6		G		200		2		南

DataFrame.apply(func, axis=0, broadcast=None, raw=False, reduce=None, result_type=None, args=(), **kwds)

将传入的func应用到每一列或每一行,进行元素级别的运算

func : function Function to apply to each column or row.

axis : {0 or ‘index’, 1 or ‘columns’}, default 0 Axis along which the function is applied:

0 or ‘index’: apply function to each column. 1 or ‘columns’: apply function to each row.

df = pd.DataFrame([[4, 9],] * 3, columns=['A', 'B'])
print(df)
print(df.apply(np.sqrt))
print(df.apply(np.sum, axis=1))
print(df.apply(np.sum, axis=0))
df.apply(lambda x: pd.Series([1, 2], index=['foo', 'bar']), axis=1)
    A	B
0	4	9
1	4	9
2	4	9

	A	B
0	2.0	3.0
1	2.0	3.0
2	2.0	3.0

0    13
1    13
2    13
dtype: int64

A    12
B    27
dtype: int64

	foo	bar
0	1	2
1	1	2
2	1	2

DataFrame.applymap(func)

Apply a function to a Dataframe elementwise.

This method applies a function that accepts and returns a scalar to every element of a DataFrame.

Parameters: func : callable ,Python function, returns a single value from a single value.

Returns: DataFrame:Transformed DataFrame.

df = pd.DataFrame([[1, 2.12], [3.356, 4.567]])
print(df)
print(df.applymap(lambda x: len(str(x)))
print(df.applymap(lambda x: x**2))  # faster
print(df **2 )  #尽量不使用
	  0		  1
0	1.000	2.120
1	3.356	4.567

	0	1
0	3	4
1	5	5

	0				1
0	1.000000	4.494400
1	11.262736	20.857489

	0				1
0	1.000000	4.494400
1	11.262736	20.857489

区别与联系
map() python 自带, 对DF中的元素级别的操作, 可以对df的某列或某多列
apply(func) 是DF的属性, 对DF中的行数据或列数据应用func操作.
applymap(func) 是DF的属性, 对整个DF所有元素应用func操作

参考文献
http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html
https://blog.csdn.net/zzpdbk/article/details/79232661

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值