数据结构&Series:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
'''
series {索引 + 数据} 形式
索引是自动生成的
'''
#通过 list 创建
s1 = pd.Series([ 1 , 2 , 3 , 4 , 5 ])
#通过np数组创建
arr1 = np.arange( 10 )
s2 = pd.Series(arr1)
#自定义索引
s2 = pd.Series(arr1, index = [ 'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' , 'h' , 'i' , 'j' ])
#单独查看值或索引
print (s1.values)
print (s1.index)
#字典索引超出 会显示nan 值 不会像数组创建series一样报错
#通过字典来创建series 由于字典无序 所以每次打印顺序可能不同, 所以可以添加索引 保证顺序
dict1 = { '姓名' : '李宁' , '班级' : '三班' , '年龄' : '22' }
print (dict1)
s3 = pd.Series(dict1, index = [ '姓名' , '班级' , '年龄' , '性别' ])
#判断values是否为空nan
print (s3.isnull())
#判断values是否不为空
print (s3.notnull())
#通过下标取数据
print (s3[ 1 ])
#通过标签名取数字
print (s3[ '姓名' ])
#选取多个
print (s2[[ 1 , 5 ]])
#切片取值
print (s2[ 1 : 4 ]) #索引切边 是 左闭右开
print (s2[ 'b' : 'h' ]) #标签切片可以包含末端数据 如h
#bool索引取值
print (s2[s2> 5 ])
#索引与数据的对应关系 不被 运算所影响
#name 属性
s2.name = '佳林' #数组对象名---values标题
s2.index.name = '字母表' #索引名 ---- index标题
#查看前三行
print (s2.head( 3 ))
#查看后两行
print (s2.tail( 2 ))
|
DataFrame的构建:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
#构造多类型字典
data = {
'a' : [ 1 , 2 , 3 , 4 ],
'b' : ( 5 , 6 , 7 , 8 ),
'c' : np.arange( 9 , 13 )
}
frame = pd.DataFrame(data)
#查看行索引
print (frame.index)
#查看列索引
print (frame.columns)
#查看values
print (frame.values) #返回nparray类型的二维数组
#指定行索引
frame = pd.DataFrame(data, index = [ 'A' , 'B' , 'C' , 'D' ])
#指定列行索引
frame = pd.DataFrame(data, index = [ 'A' , 'B' , 'C' , 'D' ], columns = [ 'a' , 'b' , 'c' , 'd' ])
#series构成的字典构造dataframe
pd1 = pd.DataFrame({ 'a' : pd.Series(np.arange( 5 )),
'b' : pd.Series(np.arange( 3 , 5 ))
})
#dataframe的每列元素类型必须统一
#通过字典构造的字典来构造dataframe(嵌套)
data1 = {
'a' : {
'apple' : '3.6' ,
'banan' : '3.5'
},
'b' : {
'apple' : '3.6' ,
'banan' : '3.5' ,
'red' : '3.7' ,
'yellow' : '3.8'
}
}
#最内层字典的key是index
#外层字典的key是columns
#通过二位数组来构造dataframe----默认columns和index都是0-n
arr1 = np.arange( 12 ).reshape( 3 , 4 )
print (arr1)
frame1 = pd.DataFrame(arr1)
#字典构造的列表 构造 dataframe
li = [{ 'apple' : '3.6' , 'orange' : '2.5' }, { 'apple' : '4.8' , 'orange' : '2.8' }, { 'apple' : '2.4' }]
li_data = pd.DataFrame(li)
#Series构成的列表 构成dataframe
l2 = [pd.Series(np.random.rand( 3 )), pd.Series(np.random.rand( 3 ))]
l2_data = pd.DataFrame(l2)
|
索引操作:
1
2
3
4
5
6
7
8
9
|
ps = pd.Series( range ( 5 ))
pd1 = pd.DataFrame(np.arange( 9 ).reshape( 3 , 3 ),
index = [ 'a' , 'b' , 'c' ], columns = [ 'A' , 'B' , 'C' ])
#重新索引 reindex 创建一个符合新索引的新对象
ps2 = ps.reindex([ 'a' , 'b' , 'c' , 'd' , 'e' ])
print (ps2) #因为新索引与之前的索引没有对应关系 所以values全为空!!!!
#dataframe行索引重建顺序调整
pd2 = pd1.reindex([ 'a' , 'b' , 'c' , 'd' ])
pd3 = pd1.reindex(columns = [ 'B' , 'C' , 'A' , 'B' ])
|
DataFrame基本操作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
np.random.seed( 1 )
pd1 = pd.DataFrame(np.random.randint( 0 , 10 , size = ( 3 , 5 )), columns = [ 'a' , 'b' , 'c' , 'd' , 'e' ], index = [ 'A' , 'B' , 'C' ])
print (pd1)
#和numpy一样 进行转至 切片提取
# print(pd1.T)
print (pd1[: 'B' ][ 'e' ]) #第一个或只有一个[]默认是行索引index 第二个[]是columns
#增加列
pd1[ 'f' ] = [ 5 , 5 , 5 ]
print (pd1)
#删除列
del (pd1[ 'd' ])
print (pd1)
#修改行索引名----只能赋值
1 \直接赋值法
pd1.index = [ 'a' , 'b' ........]
2 \自定义函数法
def test_map(x):
return x + '_ABC'
pd1.rename(index = test_map,inplace = True )
#修改列索引名
1 \直接赋值
pd1.columns = []
2 \用 str 进行广播操作 如整体去掉某符号
pd1.columns = pd1.columns. str .strip( '$' )
3 \函数法
pd1.columns = pd1.columns. map ( lambda x:x[ 1 :])
4 \rename属性
# 直接法(好处:也可只修改特定的列)----字典values替代key
df.rename(columns = ( '$a' : 'a' , '$b' : 'b' , '$c' : 'c' , '$d' : 'd' , '$e' : 'e' }, inplace = True )
# 函数法
df.rename(columns = lambda x:x.replace( '$' ,''), inplace = True )
#提取行、列的loc和iloc
#iloc是按索引位置提取
#loc是按标签提取
df.loc[:, 'a' ] #提取a列
df.loc[:, [ 'a' , 'c' ]] #提取ac列
df.loc[ 1 ] #提取行标签为1的行
df.iloc[ 1 ] #提取行位置为1的行也就是第二行
df.loc[: 2 ] #提取多行
#loc没有左闭右开
df.loc[ 0 : 1 , 'b' ] #提取行索引0-1包括1 的‘b'列
df1.loc[ 'a' : 'B' , 'c' : 'd' ] #按标签提取某范围的行列
#多条件
df[(df[ 'a' ]< = 2 ) & (df[ 'b' ]> = 5 )]
df.loc[(df[ 'a' ]< = 2 ) & (df[ 'b' ]> = 5 )]
# 或 条件 不能使用 or
df[(df[ 'a' ]< = 2 ) | (df[ 'b' ]> = 5 )]
df.loc[(df[ 'a' ]< = 2 ) | (df[ 'b' ]> = 5 )]
|
广播运算:
1
2
3
4
5
6
7
8
9
10
11
|
arr = np.arange( 12 ).reshape( 3 , 4 )
print (arr)
#广播 每一行都减去第一行
print (arr - arr[ 0 ])
#默认series的行索引 匹配的是dataframe的列索引
df1 = pd.DataFrame(np.arange( 12 ).reshape( 4 , 3 ), index = [ 'a' , 'b' , 'c' , 'd' ], columns = list ( 'ABC' ))
s3 = df1.iloc[ 0 ] #取第一行
print (s3)
print (df1 - s3)
#沿着列运算
print (df1.sub(s4, axis = 0 ))
|
索引增删改查:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#增
##series
ps[ 4 ] = 9
print (ps)
ps1 = pd.Series({ 'v' : 's' , 'f' : 's' })
pss = ps.append(ps1) #append拼接 这个方法不会影响原有数据
##dataframe
###增加列
df[ 'd' ] = [ 9 , 8 , 9 ]
###插入
df.insert( 0 , 'M' , 1 ) #在第0列插入M全为1
##高级标签索引--增加行loc
df.loc[ 'q' ] = 1
row = { 'M' : 's' , 'a' : 'b' , 'b' : 'w' , 'c' : 'w' , 'd' : 8 }
dfnew = df.append(row, ignore_index = True ) #ignore_index:如果设置为true,则无视表的index,直接合并,合并后生成新的index。
#删
del ps[ 0 ]
#del只能删除dataframe的列
del df[ 'M' ]
#*******drop******删除轴上的数据
#dataframe删除行
print (df.drop([ 'S' , 'W' ]))
#指定轴删除列
print (df.drop([ 'a' , 'c' ], axis = 1 ))
ps = pd.Series( range ( 1 , 5 ))
#改
ps[ 0 ] = 888
print (ps)
df.a = 6
#修改行数据
df.loc[ 'S' ] = 888
#修改单个元素
df.loc[ 'D' , 'b' ] = 8848
|
字符串元素处理:
in:
1
2
3
4
5
6
7
8
9
10
11
|
data = { 'a' : 'aeac@qq.com' , 'b' : 'stevan@famil.com' , 'c' : 'asda@asd.com' , 'd' : np.nan}
data = pd.Series(data)
print (data)
print (data.isnull())
#字符串查找
print (data. str .contains( 'qq' ))
#分割
print (data. str .split(r '@' ))
print (data. str .findall(r '@' ))
#切片
print (data. str [: 5 ])
|
out:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
a aeac@qq.com
b stevan@famil.com
c asda@asd.com
d NaN
dtype: object
a False
b False
c False
d True
dtype: bool
a True
b False
c False
d NaN
dtype: object
a [aeac, qq.com]
b [stevan, famil.com]
c [asda, asd.com]
d NaN
dtype: object
a [@]
b [@]
c [@]
d NaN
dtype: object
a aeac@
b steva
c asda@
d NaN
dtype: object
|
数据规整:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
pd.merge(data1, data2, on = '按照哪一行合并' , how = 'left或right或outer或inner' )
pd.merge(df_obj5, df_obj6, how = 'outer' , left_index = True , right_index = True )
pd.merge(df_obj3, df_obj4, left_on = 'key' , right_index = True )
pd.concat([df1, df2], join = 'inner\outer' , axis = 1
stack 列索引在最外层 columns在内层 变成series
外层索引为index内层索引变成columns - - unstack()
g = df1.groupby(by = 'fruit' )
for name,group in g:
print (name)
print ( '-' * 30 )
print (group)
apple
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
fruit color price
0 apple red 8.5
3 apple cyan 7.8
banana
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
fruit color price
1 banana yellow 6.8
4 banana cyan 6.4
orange
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
fruit color price
2 orange yellow 5.6
#利用字典来获取具体分组名的dataframe
s = dict ( list (df1.groupby(by = 'fruit' )))
s[ 'apple' ]
def diff(arr):
return arr. max () - arr. min ()
df1.groupby(by = 'fruit' )[ 'price' ].agg(diff)
|
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注服务器之家的更多内容!
原文链接:https://blog.csdn.net/weixin_51531943/article/details/120968388