04-快速进阶-函数映射-排序-重复轴判断

目录

    • 3.4函数运用和映射
      • !!!!!df.apply(func ,axis=0/1)
      • xxx.applymap(func)应用到xxx每个元素上
    • 3.5排序
      • pandas 排序
    • 3.6 重复轴的判断
      • Series.is_unique 判断Series的值是否唯一,是否有重复

import pandas as pd
import numpy as np
from pandas import Series,DataFrame

3.4函数运用和映射

df1=DataFrame(
    np.random.choice(range(20),size=(4,3),replace=False),
    index=list('ABCD'),
    columns=list('abc')
)
df1
	a	b	c
A	14	11	5
B	15	6	10
C	16	4	9
D	8	12	17
# 使用numpy的函数操作,axis=0 跨行
np.sum(df1,axis=1)
A    30
B    31
C    29
D    37
dtype: int64
# 平均
print(df1)
np.mean(df1)
    a   b   c
A  14  11   5
B  15   6  10
C  16   4   9
D   8  12  17
a    13.25
b     8.25
c    10.25
dtype: float64
# 极差
np.ptp(df1)
13
# 最大
np.max(df1)
a    16
b    12
c    17
dtype: int32
# 最小
np.min(df1)
a    8
b    4
c    5
dtype: int32

!!!!!df.apply(func ,axis=0/1)

对某个pbj 的行 或列 应用一个函数 func

def myptp(x):
    return x.max()-x.min()
print(df1)
df1.apply(myptp)
    a   b   c
A  14  11   5
B  15   6  10
C  16   4   9
D   8  12  17
a     8
b     8
c    12
dtype: int64
# 直接用匿名函数
df1.apply(lambda x:x.max()-x.min())
a     8
b     8
c    12
dtype: int64
df2=DataFrame(
    np.random.randn(4,3),
    index=list('ABCD'),
    columns=list('一二三')
)
df2
一	二	三
A	0.903163	-1.857063	1.205145
B	0.052014	2.371273	0.358356
C	-0.735644	-0.086702	0.257610
D	0.448260	2.394678	-0.672350	
round(3.1415,2)
3.14
df2.apply(lambda x:round(x,3))
一	二	三
A	0.903	-1.857	1.205
B	0.052	2.371	0.358
C	-0.736	-0.087	0.258
D	0.448	2.395	-0.672

xxx.applymap(func)应用到xxx每个元素上

# 这样写返回的是字符串
df2.applymap(lambda x:'%.3f'%x)
一	二	三
A	0.903	-1.857	1.205
B	0.052	2.371	0.358
C	-0.736	-0.087	0.258
D	0.448	2.395	-0.672
# 方法1、返回的是float
df2.applymap(lambda x:float('%.3f'%x))
一	二	三
A	0.903	-1.857	1.205
B	0.052	2.371	0.358
C	-0.736	-0.087	0.258
D	0.448	2.395	-0.672
# 方法2、返回的是float
df2.applymap(lambda x:float('%.3f'%x)).applymap(lambda x:float(x))
一	二	三
A	0.903	-1.857	1.205
B	0.052	2.371	0.358
C	-0.736	-0.087	0.258
D	0.448	2.395	-0.672
# 方法3、返回的是float
DataFrame(df2.applymap(lambda x:float('%.3f'%x)),dtype=float)
一	二	三
A	0.903	-1.857	1.205
B	0.052	2.371	0.358
C	-0.736	-0.087	0.258
D	0.448	2.395	-0.672

3.5排序

# list.sort()    操作于原值
# ndarray.sort()   操作于原值
# np.sort(ndarray)   原值不变,返回新值

pandas 排序

obj.sort_index(ascending=True)默认升序
obj.sort_values(by=‘label’,axis=0,ascending=True,inplace=False)
by:str 表示根据axis方向的索引名进行排序
axis:0/1 表示轴
ascending:bool 默认升序,False降序
inplace:默认不在原值上排序,返回新值

# 准备个Series
s1=Series(np.random.choice(range(1,7),6,replace=False)*10,index=list('adefcb'))
s1
a    30
d    10
e    40
f    50
c    60
b    20
dtype: int32
# 排 索引
s1.sort_index()
a    30
b    20
c    60
d    10
e    40
f    50
dtype: int32
s1.sort_values()
d    10
b    20
a    30
e    40
f    50
c    60
dtype: int32
s1.sort_values(ascending=False)
c    60
f    50
e    40
a    30
b    20
d    10
dtype: int32
# 对 DataFrame 排序
df3 = DataFrame(
    np.random.randint(1,100,15).reshape(3,5) ,
    index = 'three/two/one'.split('/'),
    columns=list('baced')
)
df3
b	a	c	e	d
three	32	59	26	72	47
two	55	46	62	67	70
one	34	14	54	8	71
# 排 索引
df3.sort_index()
b	a	c	e	d
one	34	14	54	8	71
three	32	59	26	72	47
two	55	46	62	67	70
df3.sort_index(axis=1)
a	b	c	d	e
three	59	32	26	47	72
two	46	55	62	70	67
one	14	34	54	71	8
# 排值
df3.sort_values(by='b')
b	a	c	e	d
three	32	59	26	72	47
one	34	14	54	8	71
two	55	46	62	67	70
# 按照one降序排序
df3.sort_values(by='one',axis=1,ascending=False)
d	c	b	a	e
three	47	26	32	59	72
two	70	62	55	46	67
one	71	54	34	14	8
# 模拟创建一个成绩表,语文,数学,英语。各科成绩有重复。
names = '尺,寸,人,下,匕,卜,之,田,丫,乃,贝,井,工,几,女,巨,爪,火,了,方,木,中,寸,石,户,友,夫,不,可,主,又,丑,巾,口,电,门,术,儿,羊,丁,心,天,化,气,正,页,兄,伏,大,计'.split(',')
df4 = DataFrame(
    {
        '语文':np.random.randint(90,100,50),
        '数学':np.random.randint(80,100,50),
        '英语':np.random.randint(60,100,50)
    },
    index = [np.random.choice(list('赵钱孙李周吴郑王'))+names.pop(np.random.randint(0,len(names))) for i in range(50)]
​
)
df4
语文	数学	英语
孙正	93	81	99
周匕	98	95	78
周页	97	91	95
吴之	98	92	63
周下	93	89	77
王寸	93	84	67
周又	90	94	92
周寸	92	99	62
周儿	97	84	97
王乃	90	97	64
钱术	91	84	67
郑木	95	87	64
赵计	96	89	65
周口	95	80	90
赵兄	96	81	65
周羊	94	93	73
吴工	98	93	91
赵人	98	96	73
钱心	92	85	78
赵门	92	80	77
吴丁	99	89	71
李丑	94	98	98
郑爪	99	83	65
钱巾	93	89	94
钱可	92	85	97
周石	93	92	74
李伏	99	89	65
吴友	92	95	85
郑中	95	82	91
王几	92	95	94
王气	95	86	69
李不	99	81	82
周尺	92	88	97
吴火	95	89	99
孙电	98	82	88
王化	93	99	79
周丫	96	89	67
郑户	91	83	82
王井	99	83	89
钱贝	95	88	67
吴夫	93	98	99
钱了	94	92	96
李卜	95	86	65
孙大	93	88	60
赵主	91	84	90
钱女	91	92	88
王天	91	95	66
赵田	96	90	79
郑巨	96	93	75
吴方	95	98	75
# 对df4按照 语文降序排序
df4.sort_values(by='语文',ascending=False)
语文	数学	英语
李伏	99	89	65
吴丁	99	89	71
郑爪	99	83	65
李不	99	81	82
王井	99	83	89
孙电	98	82	88
周匕	98	95	78
吴之	98	92	63
吴工	98	93	91
赵人	98	96	73
周儿	97	84	97
周页	97	91	95
赵田	96	90	79
郑巨	96	93	75
赵计	96	89	65
周丫	96	89	67
赵兄	96	81	65
吴火	95	89	99
郑中	95	82	91
吴方	95	98	75
王气	95	86	69
钱贝	95	88	67
周口	95	80	90
郑木	95	87	64
李卜	95	86	65
李丑	94	98	98
钱了	94	92	96
周羊	94	93	73
王化	93	99	79
吴夫	93	98	99
孙大	93	88	60
孙正	93	81	99
周石	93	92	74
周下	93	89	77
王寸	93	84	67
钱巾	93	89	94
钱心	92	85	78
周寸	92	99	62
王几	92	95	94
周尺	92	88	97
赵门	92	80	77
钱可	92	85	97
吴友	92	95	85
钱术	91	84	67
郑户	91	83	82
赵主	91	84	90
钱女	91	92	88
王天	91	95	66
周又	90	94	92
王乃	90	97	64
# 按照多个值排序 by=[ 列1,列2,... ]  语文降序排序
df4.sort_values(by=['语文','数学'],ascending=False)
语文	数学	英语
吴丁	99	89	71
李伏	99	89	65
郑爪	99	83	65
王井	99	83	89
李不	99	81	82
赵人	98	96	73
周匕	98	95	78
吴工	98	93	91
吴之	98	92	63
孙电	98	82	88
周页	97	91	95
周儿	97	84	97
郑巨	96	93	75
赵田	96	90	79
赵计	96	89	65
周丫	96	89	67
赵兄	96	81	65
吴方	95	98	75
吴火	95	89	99
钱贝	95	88	67
郑木	95	87	64
王气	95	86	69
李卜	95	86	65
郑中	95	82	91
周口	95	80	90
李丑	94	98	98
周羊	94	93	73
钱了	94	92	96
王化	93	99	79
吴夫	93	98	99
周石	93	92	74
周下	93	89	77
钱巾	93	89	94
孙大	93	88	60
王寸	93	84	67
孙正	93	81	99
周寸	92	99	62
吴友	92	95	85
王几	92	95	94
周尺	92	88	97
钱心	92	85	78
钱可	92	85	97
赵门	92	80	77
王天	91	95	66
钱女	91	92	88
钱术	91	84	67
赵主	91	84	90
郑户	91	83	82
王乃	90	97	64
周又	90	94	92
# df4.sum(axis=1)
# df4['总分']=df4.sum(axis=1)
df4.insert(3,'总分',df4.sum(axis=1))
df4
语文	数学	英语	总分
孙正	93	81	99	273
周匕	98	95	78	271
周页	97	91	95	283
吴之	98	92	63	253
周下	93	89	77	259
王寸	93	84	67	244
周又	90	94	92	276
周寸	92	99	62	253
周儿	97	84	97	278
王乃	90	97	64	251
钱术	91	84	67	242
郑木	95	87	64	246
赵计	96	89	65	250
周口	95	80	90	265
赵兄	96	81	65	242
周羊	94	93	73	260
吴工	98	93	91	282
赵人	98	96	73	267
钱心	92	85	78	255
赵门	92	80	77	249
吴丁	99	89	71	259
李丑	94	98	98	290
郑爪	99	83	65	247
钱巾	93	89	94	276
钱可	92	85	97	274
周石	93	92	74	259
李伏	99	89	65	253
吴友	92	95	85	272
郑中	95	82	91	268
王几	92	95	94	281
王气	95	86	69	250
李不	99	81	82	262
周尺	92	88	97	277
吴火	95	89	99	283
孙电	98	82	88	268
王化	93	99	79	271
周丫	96	89	67	252
郑户	91	83	82	256
王井	99	83	89	271
钱贝	95	88	67	250
吴夫	93	98	99	290
钱了	94	92	96	282
李卜	95	86	65	246
孙大	93	88	60	241
赵主	91	84	90	265
钱女	91	92	88	271
王天	91	95	66	252
赵田	96	90	79	265
郑巨	96	93	75	264
吴方	95	98	75	268
df4[df4['英语']>90]
语文	数学	英语	总分
孙正	93	81	99	273
周页	97	91	95	283
周又	90	94	92	276
周儿	97	84	97	278
吴工	98	93	91	282
李丑	94	98	98	290
钱巾	93	89	94	276
钱可	92	85	97	274
郑中	95	82	91	268
王几	92	95	94	281
周尺	92	88	97	277
吴火	95	89	99	283
吴夫	93	98	99	290
钱了	94	92	96	282

3.6 重复轴的判断

s6=Series(range(10),index=list('aaaabbbccc'))
s6
a    0
a    1
a    2
a    3
b    4
b    5
b    6
c    7
c    8
c    9
dtype: int64
# 索引有重复,读取
s6['a']
a    0
a    1
a    2
a    3
dtype: int64

Series.is_unique 判断Series的值是否唯一,是否有重复

s6.is_unique
True
# 可以用来判断 索引对象是否唯一
s6.index.is_unique
False
df4.index.is_unique
True

你可能感兴趣的:(04-快速进阶-函数映射-排序-重复轴判断)