Python数据分析常用语法
一行代码定义List
number = [ 1 , 2 , 3 , 4 , 5 ]
double = [ ]
for n in number:
if n % 2 == 0 :
double. append( n * 2 )
double
[4, 8]
number = [ 1 , 2 , 3 , 4 , 5 ]
double = [ n* 2 for n in number if n % 2 == 0 ]
double
[4, 8]
Lambda表达式:匿名函数
third = lambda x : x * 3
third( 5 )
15
Map函数:对列表每个元素执行某种操作并用list转换为新列表
a = [ 1 , 2 , 3 , 4 ]
a_2 = list ( map ( lambda x : x ** 2 , a) )
a_2
[1, 4, 9, 16]
Filter函数:过滤函数,接受一个列表和一个规则,返回符合条件的子列表
b = [ 1 , 2 , 3 , 4 ]
b_2 = list ( filter ( lambda x : x >= 2 , b) )
b_2
[2, 3, 4]
np.arange函数:返回给定步长的等差列表,参数依次为开始值、结束值、步长,满足左闭右开
import numpy as np
np. arange( 3 , 9 , 3 )
array([3, 6])
np.linspace函数:指定数目均匀分割区间,左右均为闭区间
import numpy as np
np. linspace( 2.0 , 10.0 , num = 3 )
array([ 2., 6., 10.])
Axis轴:处理列,设置为1;处理行,设置为0。因为df.shape返回的元组为(rows,columns)
import pandas as pd
score = pd. DataFrame( {
'语文' : [ 85 , 70 , 20 , 60 ] ,
'数学' : [ 60 , 80 , 90 , 30 ] ,
'英语' : [ 88 , 77 , 55 , 66 ]
} )
score
数学 英语 语文 0 60 88 85 1 80 77 70 2 90 55 20 3 30 66 60
score. drop( '语文' , axis = 1 )
score. drop( 0 , axis = 0 )
数学 英语 语文 1 80 77 70 2 90 55 20 3 30 66 60
pd.concat函数:连接多个dataframe,指定axis的值可在下面拼接或右侧拼接
import pandas as pd
class_1 = pd. DataFrame( {
'姓名' : [ '李' , '张' , '赵' ] ,
'语文' : [ 85 , 70 , 60 ] ,
'数学' : [ 62 , 80 , 92 ]
} )
class_2 = pd. DataFrame( {
'姓名' : [ '钟' , '陈' , '匡' ] ,
'语文' : [ 77 , 68 , 90 ] ,
'数学' : [ 82 , 72 , 58 ]
} )
pd. concat( [ class_1, class_2] , axis = 0 )
姓名 数学 语文 0 李 62 85 1 张 80 70 2 赵 92 60 0 钟 82 77 1 陈 72 68 2 匡 58 90
pd. concat( [ class_1, class_2] , axis = 1 )
姓名 数学 语文 姓名 数学 语文 0 李 62 85 钟 82 77 1 张 80 70 陈 72 68 2 赵 92 60 匡 58 90
pd.merge函数:连接有公共列的dataframe,按列拼接在右边
import pandas as pd
class_1 = pd. DataFrame( {
'姓名' : [ '李' , '张' , '赵' ] ,
'语文' : [ 85 , 70 , 60 ] ,
'数学' : [ 62 , 80 , 92 ]
} )
class_2 = pd. DataFrame( {
'姓名' : [ '李' , '张' , '赵' ] ,
'英语' : [ 77 , 68 , 90 ] ,
'物理' : [ 82 , 72 , 58 ]
} )
pd. merge( class_1, class_2, on = [ '姓名' ] )
姓名 数学 语文 物理 英语 0 李 62 85 82 77 1 张 80 70 72 68 2 赵 92 60 58 90
how参数解释:控制参照项。left、right分别按本边操作、inner是取交集,outer取并集。
import pandas as pd
left = pd. DataFrame( { 'key1' : [ 'K0' , 'K0' , 'K1' , 'K2' ] ,
'key2' : [ 'K0' , 'K1' , 'K0' , 'K1' ] ,
'A' : [ 'A0' , 'A1' , 'A2' , 'A3' ] ,
'B' : [ 'B0' , 'B1' , 'B2' , 'B3' ] } )
right = pd. DataFrame( { 'key1' : [ 'K0' , 'K1' , 'K1' , 'K2' ] ,
'key2' : [ 'K0' , 'K0' , 'K0' , 'K0' ] ,
'C' : [ 'C0' , 'C1' , 'C2' , 'C3' ] ,
'D' : [ 'D0' , 'D1' , 'D2' , 'D3' ] } )
print ( left)
print ( right)
pd. merge( left, right)
A B key1 key2
0 A0 B0 K0 K0
1 A1 B1 K0 K1
2 A2 B2 K1 K0
3 A3 B3 K2 K1
C D key1 key2
0 C0 D0 K0 K0
1 C1 D1 K1 K0
2 C2 D2 K1 K0
3 C3 D3 K2 K0
A B key1 key2 C D 0 A0 B0 K0 K0 C0 D0 1 A2 B2 K1 K0 C1 D1 2 A2 B2 K1 K0 C2 D2
pd. merge( left, right, how= 'left' , on= [ 'key1' , 'key2' ] )
A B key1 key2 C D 0 A0 B0 K0 K0 C0 D0 1 A1 B1 K0 K1 NaN NaN 2 A2 B2 K1 K0 C1 D1 3 A2 B2 K1 K0 C2 D2 4 A3 B3 K2 K1 NaN NaN
pd. merge( left, right, how= 'right' , on= [ 'key1' , 'key2' ] )
A B key1 key2 C D 0 A0 B0 K0 K0 C0 D0 1 A2 B2 K1 K0 C1 D1 2 A2 B2 K1 K0 C2 D2 3 NaN NaN K2 K0 C3 D3
pd. merge( left, right, how= 'inner' , on= [ 'key1' , 'key2' ] )
A B key1 key2 C D 0 A0 B0 K0 K0 C0 D0 1 A2 B2 K1 K0 C1 D1 2 A2 B2 K1 K0 C2 D2
pd. merge( left, right, how= 'outer' , on= [ 'key1' , 'key2' ] )
A B key1 key2 C D 0 A0 B0 K0 K0 C0 D0 1 A1 B1 K0 K1 NaN NaN 2 A2 B2 K1 K0 C1 D1 3 A2 B2 K1 K0 C2 D2 4 A3 B3 K2 K1 NaN NaN 5 NaN NaN K2 K0 C3 D3
Join函数:按相同的列名或行名合并两个dataframe
只要两个表列名不同,不加任何参数就可以直接用。 如果两个表有重复的列名,需指定lsuffix, rsuffix参数。 其中参数的意义与merge方法基本相同,只是join方法默认为左外连接
import pandas as pd
left = pd. DataFrame( { 'key1' : [ 'K0' , 'K0' , 'K1' ] ,
'A' : [ 'A0' , 'A1' , 'A3' ]
} )
right = pd. DataFrame( { 'key2' : [ 'K0' , 'K1' , 'K2' ] ,
'C' : [ 'C0' , 'C1' , 'C2' ]
} )
print ( left)
print ( right)
left. join( right)
A key1
0 A0 K0
1 A1 K0
2 A3 K1
C key2
0 C0 K0
1 C1 K1
2 C2 K2
A key1 C key2 0 A0 K0 C0 K0 1 A1 K0 C1 K1 2 A3 K1 C2 K2
import pandas as pd
left = pd. DataFrame( { 'key1' : [ 'K0' , 'K0' , 'K1' ] ,
'A' : [ 'A0' , 'A1' , 'A3' ]
} )
right = pd. DataFrame( { 'key1' : [ 'K0' , 'K1' , 'K2' ] ,
'C' : [ 'C0' , 'C1' , 'C2' ]
} )
print ( left)
print ( right)
left. join( right, lsuffix = '_left' , rsuffix = '_right' )
A key1
0 A0 K0
1 A1 K0
2 A3 K1
C key1
0 C0 K0
1 C1 K1
2 C2 K2
A key1_left C key1_right 0 A0 K0 C0 K0 1 A1 K0 C1 K1 2 A3 K1 C2 K2
pd.apply函数:为series设计,可将一个函数应用于指定轴(行或列)上的每一个元素
import pandas as pd
df = pd. DataFrame( [ [ 4 , 9 ] ] * 3 , columns = [ 'A' , 'B' ] )
df
import numpy as np
df. apply ( np. sqrt)
df. apply ( np. sum , axis = 0 )
A 12
B 27
dtype: int64
df. apply ( np. sum , axis = 1 )
0 13
1 13
2 13
dtype: int64
pd.pivot_table函数:数据透视表,参数一为dataframe,可指定index和values。
透视表是一种可以对数据动态排布并且分类汇总的表格格式。有四个最重要的参数index、values、columns、aggfunc。 Index就是层次字段,要通过透视表获取什么信息就按照相应的顺序设置字段。必须为数值,不能是str Values可以对需要的计算数据进行筛选。 aggfunc参数可以设置我们对数据聚合时进行的函数操作。 Columns类似Index可以设置列层次字段,它不是一个必要参数,作为一种分割数据的可选方式。fill_value填充空值,margins=True进行汇总 可参考:https://www.cnblogs.com/Yanjy-OnlyOne/p/11195621.html
import pandas as pd
df1 = pd. DataFrame( {
'对手' : [ '湖人' , '勇士' , '开拓者' , '湖人' ] ,
'胜负' : [ '胜' , '负' , '负' , '负' ] ,
'得分' : [ 2 , 22 , 1 , 30 ] ,
'助攻' : [ 15 , 11 , 6 , 3 ] ,
'命中' : [ 8 , 4 , 2 , 6 ]
} )
df1
助攻 命中 对手 得分 胜负 0 15 8 湖人 2 胜 1 11 4 勇士 22 负 2 6 2 开拓者 1 负 3 3 6 湖人 30 负
pd. pivot_table( df1, index = [ '对手' ] )
助攻 命中 得分 对手 勇士 11 4 22 开拓者 6 2 1 湖人 9 7 16
pd. pivot_table( df1, index = [ '对手' , '胜负' ] )
助攻 命中 得分 对手 胜负 勇士 负 11 4 22 开拓者 负 6 2 1 湖人 胜 15 8 2 负 3 6 30
pd. pivot_table( df1, index = [ '胜负' , '对手' ] )
助攻 命中 得分 胜负 对手 胜 湖人 15 8 2 负 勇士 11 4 22 开拓者 6 2 1 湖人 3 6 30
pd. pivot_table( df1, index = [ '胜负' , '对手' ] , values = [ '命中' , '得分' ] )
命中 得分 胜负 对手 胜 湖人 8 2 负 勇士 4 22 开拓者 2 1 湖人 6 30
import numpy as np
pd. pivot_table( df1, index = [ '胜负' , '对手' ] , values = [ '命中' , '得分' ] , aggfunc = [ np. sum , np. mean] )
sum mean 命中 得分 命中 得分 胜负 对手 胜 湖人 8 2 8 2 负 勇士 4 22 4 22 开拓者 2 1 2 1 湖人 6 30 6 30
import numpy as np
pd. pivot_table( df1, index = [ '胜负' ] , columns = [ '对手' ] , values = [ '得分' ] , aggfunc = [ np. sum ] , fill_value= 0 , margins= 2 )
sum 得分 对手 勇士 开拓者 湖人 All 胜负 胜 0 0 2 2 负 22 1 30 53 All 22 1 32 55