Pandas必掌握的95道精选题型!!


本人学习比较抠字眼,所以加的注释会比较详细。希望大家可以从中学到东西!

文章目录

概念简介

pandas是Python的数据分析包。应用最广泛的pandas数据类型是Series和DataFrame。

DataFrame和Series是pandas中最常见的2种数据结构。

Series是一种类似于一维数组的对象,是由一组数据以及一组与之相关联的标签(即索引)组成的,具体的表现形式就是索引在左边,值在右边。可以理解为一维数组,它和一维数组的区别,在于Series具有索引。

DataFrame是一个表型的数据结构,它含有一组有序的列,每列间可以是不同的数据类型(数值,字符串,布尔值等)。DataFrame既有行索引又有列索引。类似于excel表格。

1.用列表创建Series

import pandas as pd
import numpy as np
s = pd.Series([1, 3, 5, np.nan, 6, 8]) #用值列表生成 Series(一维数据) 时,Pandas 默认自动生成整数索引
print(s)
print('\n')#不同结果之间空行
print(s.index)#输出s的索引

输出结果:

0    1.0
1    3.0
2    5.0
3    NaN
4    6.0
5    8.0
dtype: float64


RangeIndex(start=0, stop=6, step=1)

2.将Series转换成一维数组

s.to_numpy() #Numpy是数组;s来源于题1。

输出结果:

array([ 1.,  3.,  5., nan,  6.,  8.])

3.用数组创建Series

pd.Series(np.arange(7)) #索引默认从0开始;arange()用于创建等差数组

输出结果:

0    0
1    1
2    2
3    3
4    4
5    5
6    6
dtype: int32

4.用字典创建Series

s = pd.Series({'a':1, 'b':2, 'c':3}) #s来源于题1。
print(s)
print('\n')#不同结果之间空行
print(s.values) #字典是key:value形式,输出其中的value
print('\n')#不同结果之间空行
print(s.index) #输出索引

输出结果:

a    1
b    2
c    3
dtype: int64


[1 2 3]


Index(['a', 'b', 'c'], dtype='object')

5.用随机数创建Series

pd.Series(np.random.randn(5),index=('a','b','c','d','e'))#randn产生标准正态分布的随机数

输出结果:

a    0.184519
b    0.937082
c    0.731000
d    1.361556
e   -0.326238
dtype: float64

6.用Series 组成的字典来创建 DataFrame

pd.DataFrame({'a': pd.Series([1, 2, 3]),
              'b': pd.Series([4, 5, 6])})

输出结果:

a b
0 1 4
1 2 5
2 3 6

7.用列表组成的字典来创建 DataFrame

pd.DataFrame({'a': [1, 2, 3],
              'b': [4, 5, 6]})

输出结果:

a b
0 1 4
1 2 5
2 3 6

8.用字典组成的列表来创建 DataFrame

pd.DataFrame([{'a': 1, 'b': 4},
              {'a': 2, 'b': 5},
              {'a': 3, 'b': 6}])

输出结果:

a b
0 1 4
1 2 5
2 3 6

9.对比DataFrame与Series区别

pd.DataFrame(np.random.randint(5,size=(2,))) #有列索引;(2,)这个多个逗号代表是元组

输出结果:

0
0 3
1 3
pd.Series(np.random.randint(5,size=(2,))) #无列索引

输出结果:

0    1
1    3
dtype: int32

10.用不同字典方式创建DataFrame

df=pd.DataFrame({'A': 1.,
                 'B': pd.Timestamp('20130102'),#Timestamp时间戳
                 'C': pd.Series(1, index=list(range(4)), dtype='float32'),
                 'D': np.array([3] * 4, dtype='int32'),
                 'E': pd.Categorical(["test", "train", "test", "train"]), #Categorical类别函数
                 'F': 'foo'})
print(df)

输出结果:

     A          B    C  D      E    F
0  1.0 2013-01-02  1.0  3   test  foo
1  1.0 2013-01-02  1.0  3  train  foo
2  1.0 2013-01-02  1.0  3   test  foo
3  1.0 2013-01-02  1.0  3  train  foo

11.查看DataFrame数据类型

df.dtypes #可以看到df的列有不同的数据类型。NumPy 数组只有一种数据类型,DataFrame 每列的数据类型各不相同;df来源于题10

输出结果:

A           float64
B    datetime64[ns]
C           float32
D             int32
E          category
F            object
dtype: object

12.将DataFrame转换成二维数组

df.to_numpy() #不包含行索引与列索引;df来源于题10

输出结果:

array([[1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'test', 'foo'],
       [1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'train', 'foo'],
       [1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'test', 'foo'],
       [1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'train', 'foo']],
      dtype=object)

13.查看 DataFrame头部数据

df.head(2) #前两行;df来源于题10

输出结果:

A B C D E F
0 1.0 2013-01-02 1.0 3 test foo
1 1.0 2013-01-02 1.0 3 train foo

14.查看 DataFrame尾部数据

df.tail(2) #后两行;df来源于题10

输出结果:

A B C D E F
2 1.0 2013-01-02 1.0 3 test foo
3 1.0 2013-01-02 1.0 3 train foo

15.查看 DataFrame后三行数据

df.loc[[1,2,3]] #注意有两层中括号;df来源于题10

输出结果:

A B C D E F
1 1.0 2013-01-02 1.0 3 train foo
2 1.0 2013-01-02 1.0 3 test foo
3 1.0 2013-01-02 1.0 3 train foo

16.查看 DataFrame后三行ABC列数据

df.loc[[1,2,3],'A':'C'] #df来源于题10

输出结果:

A B C
1 1.0 2013-01-02 1.0
2 1.0 2013-01-02 1.0
3 1.0 2013-01-02 1.0

17.查看 DataFrame后三行C列往后的数据

df.loc[[1,2,3],'C':] #df来源于题10

输出结果:

C D E F
1 1.0 3 train foo
2 1.0 3 test foo
3 1.0 3 train foo

18.查看 DataFrame行索引

df.index #df来源于题10

输出结果:

Int64Index([0, 1, 2, 3], dtype='int64')

19.查看 DataFrame列索引

df.columns #df来源于题10
Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')

20.查看 DataFrame形状

df.shape #4行6列;df来源于题10

输出结果:

(4, 6)

21.按条件将E列test选出来

df[df['E'].isin(['test'])] #df来源于题10

输出结果:

A B C D E F
0 1.0 2013-01-02 1.0 3 test foo
2 1.0 2013-01-02 1.0 3 test foo

22.用含日期索引的 NumPy 数组生成 DataFrame

dates = pd.date_range('20200101', periods=6) 
dates

输出结果:

DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',
               '2020-01-05', '2020-01-06'],
              dtype='datetime64[ns]', freq='D')

23.生成含有随机数的DataFrame

np.random.seed(100) #seed是随机数种子,利用随机数种子,每次生成的随机数相同。比如保持100,每次运行生成的随机数不会变,除非改掉100这个数字。
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD')) # index为行索引,column为列索引;randn产生标准正态分布的随机数
df

输出结果:

A B C D
2020-01-01 -1.749765 0.342680 1.153036 -0.252436
2020-01-02 0.981321 0.514219 0.221180 -1.070043
2020-01-03 -0.189496 0.255001 -0.458027 0.435163
2020-01-04 -0.583595 0.816847 0.672721 -0.104411
2020-01-05 -0.531280 1.029733 -0.438136 -1.118318
2020-01-06 1.618982 1.541605 -0.251879 -0.842436

24.快速查看DataFrame的各种统计指标

df.describe() #count计数,mean平均数,std标准差,min最小值,25%下四分位数,75%上四分位数,50%中位数,max最大值;df来源于题23

输出结果:

A B C D
count 6.000000 6.000000 6.000000 6.000000
mean -0.075639 0.750014 0.149816 -0.492080
std 1.205835 0.484950 0.657494 0.619106
min -1.749765 0.255001 -0.458027 -1.118318
25% -0.570516 0.385565 -0.391572 -1.013141
50% -0.360388 0.665533 -0.015350 -0.547436
75% 0.688617 0.976511 0.559836 -0.141417
max 1.618982 1.541605 1.153036 0.435163

25.DataFrame的转置

df.T #行列颠倒;df来源于题23

输出结果:

2020-01-01 2020-01-02 2020-01-03 2020-01-04 2020-01-05 2020-01-06
A -1.749765 0.981321 -0.189496 -0.583595 -0.531280 1.618982
B 0.342680 0.514219 0.255001 0.816847 1.029733 1.541605
C 1.153036 0.221180 -0.458027 0.672721 -0.438136 -0.251879
D -0.252436 -1.070043 0.435163 -0.104411 -1.118318 -0.842436

26.按轴排序

df.sort_index(axis=0, ascending=False)#axis=0按照index排序,axis=1按照column排序;ascending=False代表降序,ascending=True代表升序;df来源于题23

输出结果:

A B C D
2020-01-06 1.618982 1.541605 -0.251879 -0.842436
2020-01-05 -0.531280 1.029733 -0.438136 -1.118318
2020-01-04 -0.583595 0.816847 0.672721 -0.104411
2020-01-03 -0.189496 0.255001 -0.458027 0.435163
2020-01-02 0.981321 0.514219 0.221180 -1.070043
2020-01-01 -1.749765 0.342680 1.153036 -0.252436

27.按值排序

df.sort_values(by='B') #sort_values默认升序;若想降序排,则改成 df.sort_values(by='B',ascending=False) 即可;df来源于题23

输出结果:

A B C D
2020-01-03 -0.189496 0.255001 -0.458027 0.435163
2020-01-01 -1.749765 0.342680 1.153036 -0.252436
2020-01-02 0.981321 0.514219 0.221180 -1.070043
2020-01-04 -0.583595 0.816847 0.672721 -0.104411
2020-01-05 -0.531280 1.029733 -0.438136 -1.118318
2020-01-06 1.618982 1.541605 -0.251879 -0.842436

28.获取DataFrame中的某一列

方法一

 df['A']#df来源于题23

输出结果:

2020-01-01   -1.749765
2020-01-02    0.981321
2020-01-03   -0.189496
2020-01-04   -0.583595
2020-01-05   -0.531280
2020-01-06    1.618982
Freq: D, Name: A, dtype: float64

方法二

 df.A #df来源于题23

输出结果:

2020-01-01   -1.749765
2020-01-02    0.981321
2020-01-03   -0.189496
2020-01-04   -0.583595
2020-01-05   -0.531280
2020-01-06    1.618982
Freq: D, Name: A, dtype: float64

29.获取DataFrame中的某几列

df.iloc[:, 1:3] #iloc()通过行号、列号选取数据,loc()通过index、column选取数据;df来源于题23

输出结果:

B C
2020-01-01 0.342680 1.153036
2020-01-02 0.514219 0.221180
2020-01-03 0.255001 -0.458027
2020-01-04 0.816847 0.672721
2020-01-05 1.029733 -0.438136
2020-01-06 1.541605 -0.251879

30.用切片方式获取DataFrame中的某几行

方法一

df[0:3] #用切片的方式取前三行,前三行索引是0、1、2,分别对应第1行、第2行、第3行;df来源于题23

输出结果:

A B C D
2020-01-01 -1.749765 0.342680 1.153036 -0.252436
2020-01-02 0.981321 0.514219 0.221180 -1.070043
2020-01-03 -0.189496 0.255001 -0.458027 0.435163

方法二

df['20200101':'20200103'] #df来源于题23

输出结果:

A B C D
2020-01-01 -1.749765 0.342680 1.153036 -0.252436
2020-01-02 0.981321 0.514219 0.221180 -1.070043
2020-01-03 -0.189496 0.255001 -0.458027 0.435163

方法三

df.iloc[0:3, :] #df来源于题23

输出结果:

A B C D
2020-01-01 -1.749765 0.342680 1.153036 -0.252436
2020-01-02 0.981321 0.514219 0.221180 -1.070043
2020-01-03 -0.189496 0.255001 -0.458027 0.435163

方法四

df[df.index.isin(['2020-01-01','2020-01-02','2020-01-03'])] #df来源于题23

输出结果:

A B C D
2020-01-01 -1.749765 0.342680 1.153036 -0.252436
2020-01-02 0.981321 0.514219 0.221180 -1.070043
2020-01-03 -0.189496 0.255001 -0.458027 0.435163

31.获取DataFrame一行数据

方法一

df.loc[dates[1]] #loc()函数使用column和index来定位;dates[1]就是第2行(索引是1);df来源于题23

输出结果:

A    0.981321
B    0.514219
C    0.221180
D   -1.070043
Name: 2020-01-02 00:00:00, dtype: float64

方法二

df.iloc[1] #iloc()函数通过行号来取行数据; df来源于题23

输出结果:

A    0.981321
B    0.514219
C    0.221180
D   -1.070043
Name: 2020-01-02 00:00:00, dtype: float64

32.获取DataFrame多列数据

df.loc[:, ['A', 'B']] #冒号代表所有行; df来源于题23

输出结果:

A B
2020-01-01 -1.749765 0.342680
2020-01-02 0.981321 0.514219
2020-01-03 -0.189496 0.255001
2020-01-04 -0.583595 0.816847
2020-01-05 -0.531280 1.029733
2020-01-06 1.618982 1.541605

33.获取DataFrame部分行、部分列数据

方法一

df.loc['20200102':'20200104', ['A','B']] #df来源于题23

输出结果:

A B
2020-01-02 0.981321 0.514219
2020-01-03 -0.189496 0.255001
2020-01-04 -0.583595 0.816847

方法二

df.iloc[0:3, 0:2] #df来源于题23

输出结果:

A B
2020-01-01 -1.749765 0.342680
2020-01-02 0.981321 0.514219
2020-01-03 -0.189496 0.255001

方法三

df.iloc[[1, 2, 4], [0, 2]] #可以挑选哪行哪列;注意有两层中括号; df来源于题23

输出结果:

A C
2020-01-02 0.981321 0.221180
2020-01-03 -0.189496 -0.458027
2020-01-05 -0.531280 -0.438136

34.获取DataFrame其中一行、部分列数据

df.loc['20200102', ['A','B']] #df来源于题23

输出结果:

A    0.981321
B    0.514219
Name: 2020-01-02 00:00:00, dtype: float64

35.获取DataFram某一个数据

方法一

df.loc[dates[0], 'A'] #第1行(索引0)与A列交叉的数字只有一个;loc()函数按标签也可以获取一组行和列; df来源于题23
-1.7497654730546974

方法二

df.at[dates[0], 'A'] #at()函数按标签只能获取单个值; df来源于题23

输出结果:

-1.7497654730546974

方法三

df.iloc[0, 0] #第一行(索引0)与第一列(索引0)交叉的数字 ;df来源于题23

输出结果:

-1.7497654730546974

方法四

df.iat[0, 0] ##第一行(索引0)与第一列(索引0)交叉的数字; df来源于题23

输出结果:

-1.7497654730546974

36.将A列为正的所有行选出来

df[df.A > 0] #df来源于题23

输出结果:

A B C D
2020-01-02 0.981321 0.514219 0.221180 -1.070043
2020-01-06 1.618982 1.541605 -0.251879 -0.842436

37.将DataFram为正的数据显示出来

df[df > 0] #df来源于题23

输出结果:

A B C D
2020-01-01 NaN 0.342680 1.153036 NaN
2020-01-02 0.981321 0.514219 0.221180 NaN
2020-01-03 NaN 0.255001 NaN 0.435163
2020-01-04 NaN 0.816847 0.672721 NaN
2020-01-05 NaN 1.029733 NaN NaN
2020-01-06 1.618982 1.541605 NaN NaN

38.DataFram的复制

df1=df.copy()
df1

输出结果:

A B C D
2020-01-01 -1.749765 0.342680 1.153036 -0.252436
2020-01-02 0.981321 0.514219 0.221180 -1.070043
2020-01-03 -0.189496 0.255001 -0.458027 0.435163
2020-01-04 -0.583595 0.816847 0.672721 -0.104411
2020-01-05 -0.531280 1.029733 -0.438136 -1.118318
2020-01-06 1.618982 1.541605 -0.251879 -0.842436

39.DataFram添加一列

方法一

df['E'] = ['a','b','b','a','c','a'] #df来源于题23
df 

输出结果:

A B C D E
2020-01-01 -1.749765 0.342680 1.153036 -0.252436 a
2020-01-02 0.981321 0.514219 0.221180 -1.070043 b
2020-01-03 -0.189496 0.255001 -0.458027 0.435163 b
2020-01-04 -0.583595 0.816847 0.672721 -0.104411 a
2020-01-05 -0.531280 1.029733 -0.438136 -1.118318 c
2020-01-06 1.618982 1.541605 -0.251879 -0.842436 a

方法二

df['F'] = pd.Series([1, 2, 3, 4, 5, 6], index=df.index) #df来源于题23
df

输出结果:

A B C D E F
2020-01-01 -1.749765 0.342680 1.153036 -0.252436 a 1
2020-01-02 0.981321 0.514219 0.221180 -1.070043 b 2
2020-01-03 -0.189496 0.255001 -0.458027 0.435163 b 3
2020-01-04 -0.583595 0.816847 0.672721 -0.104411 a 4
2020-01-05 -0.531280 1.029733 -0.438136 -1.118318 c 5
2020-01-06 1.618982 1.541605 -0.251879 -0.842436 a 6

方法三

df.insert(value=np.random.randint(0, 10, size=6),loc=6,column='G') #df来源于题23
df

输出结果:

A B C D E F G
2020-01-01 -1.749765 0.342680 1.153036 -0.252436 a 1 7
2020-01-02 0.981321 0.514219 0.221180 -1.070043 b 2 6
2020-01-03 -0.189496 0.255001 -0.458027 0.435163 b 3 2
2020-01-04 -0.583595 0.816847 0.672721 -0.104411 a 4 0
2020-01-05 -0.531280 1.029733 -0.438136 -1.118318 c 5 8
2020-01-06 1.618982 1.541605 -0.251879 -0.842436 a 6 2

40.将已经添加的E列字母改成数字并观察数据类型

#题39添加一列E之后,查看数据类型
df.dtypes #E列是字符形式; 这个df来源于题39方法三运行后的df

输出结果:

A    float64
B    float64
C    float64
D    float64
E     object
F      int64
G      int32
dtype: object
#将E列改成数字,再次查看数据类型
df['E'] = ['10','20','20','10','30','20'] #这个df来源于题39方法三运行后的df
df.dtypes #可以看到仅仅是改变了添加的内容,数据类型并没有变化

输出结果:

A    float64
B    float64
C    float64
D    float64
E     object
F      int64
G      int32
dtype: object

41.更改数据类型

df[['E']] = df[['E']].astype(int) #这个df来源于题39方法三运行后的df
df.dtypes #数据类型变化了,E列变成了int型

输出结果:

A    float64
B    float64
C    float64
D    float64
E      int32
F      int64
G      int32
dtype: object
df

输出结果:

A B C D E F G
2020-01-01 -1.749765 0.342680 1.153036 -0.252436 10 1 7
2020-01-02 0.981321 0.514219 0.221180 -1.070043 20 2 6
2020-01-03 -0.189496 0.255001 -0.458027 0.435163 20 3 2
2020-01-04 -0.583595 0.816847 0.672721 -0.104411 10 4 0
2020-01-05 -0.531280 1.029733 -0.438136 -1.118318 30 5 8
2020-01-06 1.618982 1.541605 -0.251879 -0.842436 20 6 2

42.按标签赋值

dates = pd.date_range('20200101', periods=6) 
np.random.seed(100) #seed是随机数种子,利用随机数种子,每次生成的随机数相同。比如保持100,每次运行生成的随机数不会变,除非改掉100这个数字。
df= pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD')) # index为行索引,column为列索引;randn产生标准正态分布的随机数
df

输出结果:

A B C D
2020-01-01 -1.749765 0.342680 1.153036 -0.252436
2020-01-02 0.981321 0.514219 0.221180 -1.070043
2020-01-03 -0.189496 0.255001 -0.458027 0.435163
2020-01-04 -0.583595 0.816847 0.672721 -0.104411
2020-01-05 -0.531280 1.029733 -0.438136 -1.118318
2020-01-06 1.618982 1.541605 -0.251879 -0.842436
df.at[dates[0], 'A'] = 0 #at()函数按标签只能赋值单个值,0代表第1行(索引是0);
df 

输出结果:

A B C D
2020-01-01 0.000000 0.342680 1.153036 -0.252436
2020-01-02 0.981321 0.514219 0.221180 -1.070043
2020-01-03 -0.189496 0.255001 -0.458027 0.435163
2020-01-04 -0.583595 0.816847 0.672721 -0.104411
2020-01-05 -0.531280 1.029733 -0.438136 -1.118318
2020-01-06 1.618982 1.541605 -0.251879 -0.842436

43.按位置赋值

dates = pd.date_range('20200101', periods=6) 
np.random.seed(100) #seed是随机数种子,利用随机数种子,每次生成的随机数相同。比如保持100,每次运行生成的随机数不会变,除非改掉100这个数字。
df= pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD')) # index为行索引,column为列索引;randn产生标准正态分布的随机数
df

输出结果:

A B C D
2020-01-01 -1.749765 0.342680 1.153036 -0.252436
2020-01-02 0.981321 0.514219 0.221180 -1.070043
2020-01-03 -0.189496 0.255001 -0.458027 0.435163
2020-01-04 -0.583595 0.816847 0.672721 -0.104411
2020-01-05 -0.531280 1.029733 -0.438136 -1.118318
2020-01-06 1.618982 1.541605 -0.251879 -0.842436
df.iat[0, 1] = 0 #iat()通过行号、列号选取数据,at()通过index、column选取数据
df

输出结果:

A B C D
2020-01-01 -1.749765 0.000000 1.153036 -0.252436
2020-01-02 0.981321 0.514219 0.221180 -1.070043
2020-01-03 -0.189496 0.255001 -0.458027 0.435163
2020-01-04 -0.583595 0.816847 0.672721 -0.104411
2020-01-05 -0.531280 1.029733 -0.438136 -1.118318
2020-01-06 1.618982 1.541605 -0.251879 -0.842436

44.按 NumPy 数组赋值

dates = pd.date_range('20200101', periods=6) 
np.random.seed(100) #seed是随机数种子,利用随机数种子,每次生成的随机数相同。比如保持100,每次运行生成的随机数不会变,除非改掉100这个数字。
df= pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD')) # index为行索引,column为列索引;randn产生标准正态分布的随机数
df

输出结果:

A B C D
2020-01-01 -1.749765 0.342680 1.153036 -0.252436
2020-01-02 0.981321 0.514219 0.221180 -1.070043
2020-01-03 -0.189496 0.255001 -0.458027 0.435163
2020-01-04 -0.583595 0.816847 0.672721 -0.104411
2020-01-05 -0.531280 1.029733 -0.438136 -1.118318
2020-01-06 1.618982 1.541605 -0.251879 -0.842436

方法一

df.loc[:, 'D'] = np.array([8] * len(df)) #len(df)=6,意思是8重复6遍
df

输出结果:

A B C D
2020-01-01 -1.749765 0.342680 1.153036 8
2020-01-02 0.981321 0.514219 0.221180 8
2020-01-03 -0.189496 0.255001 -0.458027 8
2020-01-04 -0.583595 0.816847 0.672721 8
2020-01-05 -0.531280 1.029733 -0.438136 8
2020-01-06 1.618982 1.541605 -0.251879 8

方法二

df.loc[:, 'D'] = [8, 8, 8, 8, 8, 8] #直接等于列表也可以
df

输出结果:

A B C D
2020-01-01 -1.749765 0.342680 1.153036 8
2020-01-02 0.981321 0.514219 0.221180 8
2020-01-03 -0.189496 0.255001 -0.458027 8
2020-01-04 -0.583595 0.816847 0.672721 8
2020-01-05 -0.531280 1.029733 -0.438136 8
2020-01-06 1.618982 1.541605 -0.251879 8

45.用条件赋值

df1 = df.copy() #df来源于题44
df1[df1>0]=-df1 #正的全变成负的
df1

输出结果:

A B C D
2020-01-01 -1.749765 -0.342680 -1.153036 -0.252436
2020-01-02 -0.981321 -0.514219 -0.221180 -1.070043
2020-01-03 -0.189496 -0.255001 -0.458027 -0.435163
2020-01-04 -0.583595 -0.816847 -0.672721 -0.104411
2020-01-05 -0.531280 -1.029733 -0.438136 -1.118318
2020-01-06 -1.618982 -1.541605 -0.251879 -0.842436

46.重建索引并添加一列空值

df2 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['G']) #df来源于题44
df2

输出结果:

A B C D G
2020-01-01 -1.749765 0.342680 1.153036 -0.252436 NaN
2020-01-02 0.981321 0.514219 0.221180 -1.070043 NaN
2020-01-03 -0.189496 0.255001 -0.458027 0.435163 NaN
2020-01-04 -0.583595 0.816847 0.672721 -0.104411 NaN

47.将其中个别空值替换成1

df2.loc[dates[0]:dates[1], 'G'] = 1 #将E列的前两个值替换成1;#df来源于题44
df2

输出结果:

A B C D G
2020-01-01 -1.749765 0.342680 1.153036 -0.252436 1.0
2020-01-02 0.981321 0.514219 0.221180 -1.070043 1.0
2020-01-03 -0.189496 0.255001 -0.458027 0.435163 NaN
2020-01-04 -0.583595 0.816847 0.672721 -0.104411 NaN

48.删除缺失值

df2.dropna(how='any') #dropna()函数删除缺失值;how='any'删除含有缺失值的行,how='all'只有整行全是缺失值才删除这行;df2来源于题47

输出结果:

A B C D G
2020-01-01 -1.749765 0.342680 1.153036 -0.252436 1.0
2020-01-02 0.981321 0.514219 0.221180 -1.070043 1.0

49.填充缺失值

df2.fillna(value=5) #缺失值都换成5;df2来源于题47

输出结果:

A B C D G
2020-01-01 -1.749765 0.342680 1.153036 -0.252436 1.0
2020-01-02 0.981321 0.514219 0.221180 -1.070043 1.0
2020-01-03 -0.189496 0.255001 -0.458027 0.435163 5.0
2020-01-04 -0.583595 0.816847 0.672721 -0.104411 5.0

50.判断是否缺失值

pd.isna(df2) #df2来源于题47

输出结果:

A B C D G
2020-01-01 False False False False False
2020-01-02 False False False False False
2020-01-03 False False False False True
2020-01-04 False False False False True

51.求每列均值

dates = pd.date_range('20200101', periods=6) 
np.random.seed(100) #seed是随机数种子,利用随机数种子,每次生成的随机数相同。比如保持100,每次运行生成的随机数不会变,除非改掉100这个数字。
df= pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD')) # index为行索引,column为列索引;randn产生标准正态分布的随机数
df

输出结果:

A B C D
2020-01-01 -1.749765 0.342680 1.153036 -0.252436
2020-01-02 0.981321 0.514219 0.221180 -1.070043
2020-01-03 -0.189496 0.255001 -0.458027 0.435163
2020-01-04 -0.583595 0.816847 0.672721 -0.104411
2020-01-05 -0.531280 1.029733 -0.438136 -1.118318
2020-01-06 1.618982 1.541605 -0.251879 -0.842436
df.mean() 

输出结果:

A   -0.075639
B    0.750014
C    0.149816
D   -0.492080
dtype: float64

52.求每行均值

df.mean(1)#df来源于题51

输出结果:

2020-01-01   -0.126621
2020-01-02    0.161669
2020-01-03    0.010661
2020-01-04    0.200390
2020-01-05   -0.264500
2020-01-06    0.516568
Freq: D, dtype: float64

53.求每列的累加值

df.apply(np.cumsum)#每列的数字累加;apply()使函数作用于每个列或行;#df来源于题51

输出结果:

A B C D
2020-01-01 -1.749765 0.342680 1.153036 -0.252436
2020-01-02 -0.768445 0.856899 1.374215 -1.322479
2020-01-03 -0.957941 1.111901 0.916188 -0.887316
2020-01-04 -1.541536 1.928748 1.588909 -0.991727
2020-01-05 -2.072816 2.958480 1.150774 -2.110045
2020-01-06 -0.453834 4.500086 0.898895 -2.952481

54.求每列的最大值-最小值的差

df.apply(lambda x: x.max() - x.min())#lambda()定义了自变量为x,函数公式为x.max() - x.min();#df来源于题51

输出结果:

A    3.368747
B    1.286604
C    1.611063
D    1.553482
dtype: float64

55.查看Series值的个数

s=pd.Series(np.random.randint(0, 7, size=10))#randint生成0-7范围内的随机整数,一共10个
s #左侧一列是索引,右侧一列才是随机整数

输出结果:

0    5
1    6
2    4
3    2
4    0
5    0
6    2
7    5
8    2
9    1
dtype: int32
s.value_counts() #查看右侧一列随机整数分别出现了多少次

输出结果:

2    3
5    2
0    2
6    1
4    1
1    1
dtype: int64

56.将Series的值全部改成小写

s=pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])
s

输出结果:

0       A
1       B
2       C
3    Aaba
4    Baca
5     NaN
6    CABA
7     dog
8     cat
dtype: object
s.str.lower() #改成大写字母是upper

输出结果:

0       a
1       b
2       c
3    aaba
4    baca
5     NaN
6    caba
7     dog
8     cat
dtype: object

57.将Series的值第一个字母大写,其余都小写

s.str.capitalize() #s来源于题56

输出结果:

0       A
1       B
2       C
3    Aaba
4    Baca
5     NaN
6    Caba
7     Dog
8     Cat
dtype: object

58.将DataFrame按行拆分成不同的部分

np.random.seed(100) #seed是随机数种子,利用随机数种子,每次生成的随机数相同。比如保持100,每次运行生成的随机数不会变,除非改掉100这个数字。
df = pd.DataFrame(np.random.randn(10, 4))#生成10行4列的随机数
df

输出结果:

0 1 2 3
0 -1.749765 0.342680 1.153036 -0.252436
1 0.981321 0.514219 0.221180 -1.070043
2 -0.189496 0.255001 -0.458027 0.435163
3 -0.583595 0.816847 0.672721 -0.104411
4 -0.531280 1.029733 -0.438136 -1.118318
5 1.618982 1.541605 -0.251879 -0.842436
6 0.184519 0.937082 0.731000 1.361556
7 -0.326238 0.055676 0.222400 -1.443217
8 -0.756352 0.816454 0.750445 -0.455947
9 1.189622 -1.690617 -1.356399 -1.232435
parts = [df[:3], df[3:7], df[7:]] 
parts

输出结果:

[          0         1         2         3
 0 -1.749765  0.342680  1.153036 -0.252436
 1  0.981321  0.514219  0.221180 -1.070043
 2 -0.189496  0.255001 -0.458027  0.435163,
           0         1         2         3
 3 -0.583595  0.816847  0.672721 -0.104411
 4 -0.531280  1.029733 -0.438136 -1.118318
 5  1.618982  1.541605 -0.251879 -0.842436
 6  0.184519  0.937082  0.731000  1.361556,
           0         1         2         3
 7 -0.326238  0.055676  0.222400 -1.443217
 8 -0.756352  0.816454  0.750445 -0.455947
 9  1.189622 -1.690617 -1.356399 -1.232435]

分开来看即是:

df[:3]

输出结果:

0 1 2 3
0 -1.749765 0.342680 1.153036 -0.252436
1 0.981321 0.514219 0.221180 -1.070043
2 -0.189496 0.255001 -0.458027 0.435163
df[3:7]

输出结果:

0 1 2 3
3 -0.583595 0.816847 0.672721 -0.104411
4 -0.531280 1.029733 -0.438136 -1.118318
5 1.618982 1.541605 -0.251879 -0.842436
6 0.184519 0.937082 0.731000 1.361556
df[7:]

输出结果:

0 1 2 3
7 -0.326238 0.055676 0.222400 -1.443217
8 -0.756352 0.816454 0.750445 -0.455947
9 1.189622 -1.690617 -1.356399 -1.232435

59.将58题DataFrame拆的各部分组合到一起

pd.concat(parts) #concat()连接函数

输出结果:

0 1 2 3
0 -1.749765 0.342680 1.153036 -0.252436
1 0.981321 0.514219 0.221180 -1.070043
2 -0.189496 0.255001 -0.458027 0.435163
3 -0.583595 0.816847 0.672721 -0.104411
4 -0.531280 1.029733 -0.438136 -1.118318
5 1.618982 1.541605 -0.251879 -0.842436
6 0.184519 0.937082 0.731000 1.361556
7 -0.326238 0.055676 0.222400 -1.443217
8 -0.756352 0.816454 0.750445 -0.455947
9 1.189622 -1.690617 -1.356399 -1.232435

60.连接键相同的两个DataFrame的合并

left = pd.DataFrame({'key': ['a', 'a'], 'lval': [1, 2]})
left

输出结果:

key lval
0 a 1
1 a 2
right = pd.DataFrame({'key': ['a', 'a'], 'rval': [3, 4]})
right

输出结果:

key rval
0 a 3
1 a 4
pd.merge(left, right, on='key') #merge()合并函数,需指定连接键on='key'

输出结果:

key lval rval
0 a 1 3
1 a 1 4
2 a 2 3
3 a 2 4

61.连接键不同的两个DataFrame的合并

left = pd.DataFrame({'key': ['a', 'b'], 'lval': [1, 2]})
left

输出结果:

key lval
0 a 1
1 b 2
right = pd.DataFrame({'key': ['a', 'b'], 'rval': [3, 4]})
right

输出结果:

key rval
0 a 3
1 b 4
pd.merge(left, right, on='key') #merge()合并函数,需指定连接键on='key'。可对比一下与上题的区别。

输出结果:

key lval rval
0 a 1 3
1 b 2 4

62.追加一行

df = pd.DataFrame(np.random.randn(8, 4), columns=['A', 'B', 'C', 'D'])
df

输出结果:

A B C D
0 -0.331777 -0.689218 2.034608 -0.550714
1 0.750453 -1.306992 0.580573 -1.104523
2 0.690121 0.686890 -1.566688 0.904974
3 0.778822 0.428233 0.108872 0.028284
4 -0.578826 -1.199451 -1.705952 0.369164
5 1.876573 -0.376903 1.831936 0.003017
6 -0.076023 0.003958 -0.185014 -2.487152
7 -1.704651 -1.136261 -2.973315 0.033317
s = df.iloc[3] #将索引为3的这行数据取出来
s

输出结果:

0   -0.583595
1    0.816847
2    0.672721
3   -0.104411
Name: 3, dtype: float64
df.append(s, ignore_index=True)#append添加内容;ignore_index=True对索引重新排列,为False的时候会保留之前的index
0 1 2 3
0 -1.749765 0.342680 1.153036 -0.252436
1 0.981321 0.514219 0.221180 -1.070043
2 -0.189496 0.255001 -0.458027 0.435163
3 -0.583595 0.816847 0.672721 -0.104411
4 -0.531280 1.029733 -0.438136 -1.118318
5 1.618982 1.541605 -0.251879 -0.842436
6 0.184519 0.937082 0.731000 1.361556
7 -0.326238 0.055676 0.222400 -1.443217
8 -0.756352 0.816454 0.750445 -0.455947
9 1.189622 -1.690617 -1.356399 -1.232435
10 -0.583595 0.816847 0.672721 -0.104411

63.按单列分组

df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo'],
                   'B': ['one', 'one', 'two', 'three','two', 'two', 'one', 'three'],
                   'C': np.random.randn(8),
                   'D': np.random.randn(8)})
df

输出结果:

A B C D
0 foo one -0.862227 -1.635529
1 bar one 1.249470 -1.044210
2 foo two -0.079611 0.613039
3 bar three -0.889731 0.736205
4 foo two -0.881798 1.026921
5 bar two 0.018639 -1.432191
6 foo one 0.237845 -1.841188
7 foo three 0.013549 0.366093
df.groupby('A').sum()

输出结果:

C D
A
bar 0.378377 -1.740195
foo -1.572244 -1.470664

64.按多列分组

df.groupby(['A', 'B']).sum()

输出结果:

C D
A B
bar one 1.249470 -1.044210
three -0.889731 0.736205
two 0.018639 -1.432191
foo one -0.624383 -3.476718
three 0.013549 0.366093
two -0.961410 1.639960

65.将二维数组返回元组列表

tuples = list(zip(*[['bar', 'bar', 'baz', 'baz','foo', 'foo', 'qux', 'qux'], 
                    ['one', 'two', 'one', 'two','one', 'two', 'one', 'two']]))
tuples #zip()将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。不加zip返回二维数组。

输出结果:

[('bar', 'one'),
 ('bar', 'two'),
 ('baz', 'one'),
 ('baz', 'two'),
 ('foo', 'one'),
 ('foo', 'two'),
 ('qux', 'one'),
 ('qux', 'two')]

66.多级索引

index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second']) #pd.MultiIndex.from_tuples意思是将元组列表转换为多级索引MultiIndex。
index

输出结果:

MultiIndex([('bar', 'one'),
            ('bar', 'two'),
            ('baz', 'one'),
            ('baz', 'two'),
            ('foo', 'one'),
            ('foo', 'two'),
            ('qux', 'one'),
            ('qux', 'two')],
           names=['first', 'second'])

67.利用多级索引创建DataFrame

np.random.seed(100) #seed是随机数种子,利用随机数种子,每次生成的随机数相同。比如保持100,每次运行生成的随机数不会变,除非改掉100这个数字。
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second']) #pd.MultiIndex.from_tuples意思是将元组列表转换为多级索引MultiIndex。
df = pd.DataFrame(np.random.randn(8,2), index=index, columns=['A', 'B'])#randn生成8行2列随机数
df

输出结果:

A B
first second
bar one -1.749765 0.342680
two 1.153036 -0.252436
baz one 0.981321 0.514219
two 0.221180 -1.070043
foo one -0.189496 0.255001
two -0.458027 0.435163
qux one -0.583595 0.816847
two 0.672721 -0.104411

68.堆叠

df[:4].stack() #stack()堆叠函数;在使用了stack()函数后,行越来多

输出结果:

first  second   
bar    one     A   -1.749765
               B    0.342680
       two     A    1.153036
               B   -0.252436
baz    one     A    0.981321
               B    0.514219
       two     A    0.221180
               B   -1.070043
dtype: float64

69.压缩

stacked.unstack() #与stack()相反,将行变成列,列会越来越多。默认从右侧最低级别的索引AB压缩。

输出结果:

A B
first second
bar one -1.749765 0.342680
two 1.153036 -0.252436
baz one 0.981321 0.514219
two 0.221180 -1.070043
stacked.unstack(1) #索引1是second这列

输出结果:

second one two
first
bar A -1.749765 1.153036
B 0.342680 -0.252436
baz A 0.981321 0.221180
B 0.514219 -1.070043
stacked.unstack(0)#索引0是first这列

输出结果:

first bar baz
second
one A -1.749765 0.981321
B 0.342680 0.514219
two A 1.153036 0.221180
B -0.252436 -1.070043

70.数据透视表

df = pd.DataFrame({'A': ['one', 'one', 'two', 'three'] * 3,            #重复3次
                   'B': ['A', 'B', 'C'] * 4,                           #重复4次
                   'C': ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 2,#重复2次
                   'D': np.random.randn(12),                           #产生12个随机数
                   'E': np.random.randn(12)})                          #产生12个随机数
df

输出结果:

A B C D E
0 one A foo -0.531280 -0.326238
1 one B foo 1.029733 0.055676
2 two C foo -0.438136 0.222400
3 three A bar -1.118318 -1.443217
4 one B bar 1.618982 -0.756352
5 one C bar 1.541605 0.816454
6 two A foo -0.251879 0.750445
7 three B foo -0.842436 -0.455947
8 one C foo 0.184519 1.189622
9 one A bar 0.937082 -1.690617
10 two B bar 0.731000 -1.356399
11 three C bar 1.361556 -1.232435
pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C'])

输出结果:

C bar foo
A B
one A 0.937082 -0.531280
B 1.618982 1.029733
C 1.541605 0.184519
three A -1.118318 NaN
B NaN -0.842436
C 1.361556 NaN
two A NaN -0.251879
B 0.731000 NaN
C NaN -0.438136

71.将结果写入csv文件中

df.to_csv('测试数据.csv') #df来源于题70

72.读取csv文件中的内容

pd.read_csv('测试数据.csv') #df来源于题70;Unnamed这列是显示在csv文件内,最左侧没有column的这列是索引

输出结果:

Unnamed: 0 A B C D E
0 0 one A foo -0.531280 -0.326238
1 1 one B foo 1.029733 0.055676
2 2 two C foo -0.438136 0.222400
3 3 three A bar -1.118318 -1.443217
4 4 one B bar 1.618982 -0.756352
5 5 one C bar 1.541605 0.816454
6 6 two A foo -0.251879 0.750445
7 7 three B foo -0.842436 -0.455947
8 8 one C foo 0.184519 1.189622
9 9 one A bar 0.937082 -1.690617
10 10 two B bar 0.731000 -1.356399
11 11 three C bar 1.361556 -1.232435

73.将文件写入桌面的csv文件中

df.to_csv(u'C:/Users/ZZ_sj/Desktop/测试数据.csv') #df来源于题70

74.读取桌面的csv文件

pd.read_csv(u'C:/Users/ZZ_sj/Desktop/测试数据.csv') #df来源于题70

输出结果:

Unnamed: 0 A B C D E
0 0 one A foo -0.531280 -0.326238
1 1 one B foo 1.029733 0.055676
2 2 two C foo -0.438136 0.222400
3 3 three A bar -1.118318 -1.443217
4 4 one B bar 1.618982 -0.756352
5 5 one C bar 1.541605 0.816454
6 6 two A foo -0.251879 0.750445
7 7 three B foo -0.842436 -0.455947
8 8 one C foo 0.184519 1.189622
9 9 one A bar 0.937082 -1.690617
10 10 two B bar 0.731000 -1.356399
11 11 three C bar 1.361556 -1.232435

75.将结果写入excel文件中

df.to_excel('测试数据.xlsx', sheet_name='测试sheet') #df来源于题70

76.读取excel文件中的内容

pd.read_excel('测试数据.xlsx', '测试sheet') #df来源于题70

输出结果:

Unnamed: 0 A B C D E
0 0 one A foo -0.531280 -0.326238
1 1 one B foo 1.029733 0.055676
2 2 two C foo -0.438136 0.222400
3 3 three A bar -1.118318 -1.443217
4 4 one B bar 1.618982 -0.756352
5 5 one C bar 1.541605 0.816454
6 6 two A foo -0.251879 0.750445
7 7 three B foo -0.842436 -0.455947
8 8 one C foo 0.184519 1.189622
9 9 one A bar 0.937082 -1.690617
10 10 two B bar 0.731000 -1.356399
11 11 three C bar 1.361556 -1.232435

77.将文件写入桌面的excel文件中

df.to_excel(u'C:/Users/ZZ_sj/Desktop/测试数据.xlsx', sheet_name='测试sheet') #df来源于题70

78.读取桌面的excel文件

pd.read_excel(u'C:/Users/ZZ_sj/Desktop/测试数据.xlsx', '测试sheet') #df来源于题70

输出结果:

Unnamed: 0 A B C D E
0 0 one A foo -0.531280 -0.326238
1 1 one B foo 1.029733 0.055676
2 2 two C foo -0.438136 0.222400
3 3 three A bar -1.118318 -1.443217
4 4 one B bar 1.618982 -0.756352
5 5 one C bar 1.541605 0.816454
6 6 two A foo -0.251879 0.750445
7 7 three B foo -0.842436 -0.455947
8 8 one C foo 0.184519 1.189622
9 9 one A bar 0.937082 -1.690617
10 10 two B bar 0.731000 -1.356399
11 11 three C bar 1.361556 -1.232435

79.将时间划分成1分钟的间隔

rng = pd.date_range('1/1/2020', periods=100, freq='S')
ts = pd.Series(np.random.randint(0, 500, len(rng)), index=rng)
ts

输出结果:

2020-01-01 00:00:00    299
2020-01-01 00:00:01     36
2020-01-01 00:00:02    261
2020-01-01 00:00:03    327
2020-01-01 00:00:04     38
                      ... 
2020-01-01 00:01:35     34
2020-01-01 00:01:36    451
2020-01-01 00:01:37    350
2020-01-01 00:01:38    462
2020-01-01 00:01:39    182
Freq: S, Length: 100, dtype: int32
ts.resample('1Min').sum() #resample()重采样函数
2020-01-01 00:00:00    15886
2020-01-01 00:01:00    10424
Freq: T, dtype: int32

80.将日期转换成月份

rng = pd.date_range('1/1/2020', periods=5, freq='M')#freq='M'代表月份
ts = pd.Series(np.random.randn(len(rng)), index=rng)
ts

输出结果:

2020-01-31    0.736502
2020-02-29   -2.080463
2020-03-31   -0.298586
2020-04-30   -1.729211
2020-05-31    0.003510
Freq: M, dtype: float64
ps = ts.to_period()#与以上的freq='M'对应,里面是M则该输出结果是月份
ps

输出结果:

2020-01    0.736502
2020-02   -2.080463
2020-03   -0.298586
2020-04   -1.729211
2020-05    0.003510
Freq: M, dtype: float64

81.将月份转换成日期

ps.to_timestamp()

输出结果:

2020-01-01    0.736502
2020-02-01   -2.080463
2020-03-01   -0.298586
2020-04-01   -1.729211
2020-05-01    0.003510
Freq: MS, dtype: float64

82.其他各种转换时间戳的方法

from datetime import datetime as dt
pd.Timestamp(2020,1,1)

输出结果:

Timestamp('2020-01-01 00:00:00')
pd.Timestamp(dt(2020,1,1,hour=8,minute=20,second=36))

输出结果:

Timestamp('2020-01-01 08:20:36')
pd.Timestamp("2020-1-1 8:20:36")

输出结果:

Timestamp('2020-01-01 08:20:36')
pd.to_datetime("2020-1-1 8:20:36")

输出结果:

Timestamp('2020-01-01 08:20:36')
pd.to_datetime(dt(2020,1,1,hour=8,minute=20,second=36))

输出结果:

Timestamp('2020-01-01 08:20:36')

83.统计2019年全年每个周一的值的总和

a = pd.date_range(start='2019-01-01', end='2019-12-31', freq='D')#2019年全年的日期
s = pd.Series(np.random.rand(len(a)), index=a)
s

输出结果:

2019-01-01    0.716071
2019-01-02    0.525956
2019-01-03    0.001399
2019-01-04    0.394700
2019-01-05    0.492167
                ...   
2019-12-27    0.492476
2019-12-28    0.070268
2019-12-29    0.088437
2019-12-30    0.106208
2019-12-31    0.201259
Freq: D, Length: 365, dtype: float64
s[s.index.weekday == 0].sum() #周一的索引是0

输出结果:

26.577467835063732

84.统计2019年全年每个月的值的总和

s.resample('M').sum()#resample()重采样函数

输出结果:

2019-01-31    14.458097
2019-02-28    13.957015
2019-03-31    17.684637
2019-04-30    13.987888
2019-05-31    18.670637
2019-06-30    14.137710
2019-07-31    13.183136
2019-08-31    16.380061
2019-09-30    13.328827
2019-10-31    17.721530
2019-11-30    13.749640
2019-12-31    13.204113
Freq: M, dtype: float64

85.统计2019年全年的值的总和

s.resample('Y').sum() #和s.sum()效果一样

输出结果:

2019-12-31    180.463291
Freq: A-DEC, dtype: float64

86.Series的可视化

ts = pd.Series(np.random.randn(100),index=pd.date_range('1/1/2020', periods=100)) #产生100个随机数
ts

输出结果:

2020-01-01   -1.165432
2020-01-02    0.538246
2020-01-03   -0.842861
2020-01-04   -2.874969
2020-01-05   -0.528506
                ...   
2020-04-05    0.590026
2020-04-06    1.131181
2020-04-07   -0.109074
2020-04-08   -0.058166
2020-04-09   -0.842516
Freq: D, Length: 100, dtype: float64
ts = ts.cumsum() #随机数累加
ts

输出结果:

2020-01-01    -1.165432
2020-01-02    -0.627186
2020-01-03    -1.470046
2020-01-04    -4.345015
2020-01-05    -4.873521
                ...    
2020-04-05   -11.868059
2020-04-06   -10.736878
2020-04-07   -10.845952
2020-04-08   -10.904118
2020-04-09   -11.746634
Freq: D, Length: 100, dtype: float64
import matplotlib.pyplot as plt #引入绘图库
ts.plot() #或者plt.plot(ts)
plt.show()

输出结果:

在这里插入图片描述

87.DataFrame的可视化

df = pd.DataFrame(np.random.randn(100, 4), index=ts.index,columns=['A', 'B', 'C', 'D'])#生成100行4列的随机数
df

输出结果:

A B C D
2020-01-01 -0.752946 -0.482565 0.524548 -0.264584
2020-01-02 0.353005 0.223824 -0.372199 2.647419
2020-01-03 0.133290 0.810098 -2.066454 -0.328408
2020-01-04 0.285449 0.912728 -0.885395 0.662893
2020-01-05 -1.548077 -0.555874 -0.209399 1.839871
... ... ... ... ...
2020-04-05 1.385784 0.584521 -0.248150 0.328478
2020-04-06 1.143073 0.715837 1.350801 -0.173456
2020-04-07 0.031924 -0.860370 1.417879 -0.216362
2020-04-08 -1.015489 -0.725975 1.227705 -1.126485
2020-04-09 -0.601702 0.266865 -1.028071 1.620468

100 rows × 4 columns

df = df.cumsum() #纵向累加
df

输出结果:

A B C D
2020-01-01 -0.752946 -0.482565 0.524548 -0.264584
2020-01-02 -0.399940 -0.258741 0.152349 2.382835
2020-01-03 -0.266650 0.551357 -1.914105 2.054427
2020-01-04 0.018799 1.464085 -2.799500 2.717320
2020-01-05 -1.529279 0.908211 -3.008899 4.557191
... ... ... ... ...
2020-04-05 -5.994540 5.847784 -13.020267 3.937710
2020-04-06 -4.851467 6.563621 -11.669465 3.764254
2020-04-07 -4.819543 5.703251 -10.251586 3.547893
2020-04-08 -5.835032 4.977275 -9.023881 2.421407
2020-04-09 -6.436735 5.244140 -10.051952 4.041876

100 rows × 4 columns

import matplotlib.pyplot as plt #引入绘图库
df.plot() #或者plt.plot(df)
plt.show() #这句加不加都可以

输出结果:

在这里插入图片描述

88.删除其中一列但不改变原DataFrame

np.random.seed(100) #seed是随机数种子,利用随机数种子,每次生成的随机数相同。比如保持100,每次运行生成的随机数不会变,除非改掉100这个数字。
df = pd.DataFrame(np.random.randn(6, 4), index=pd.date_range('20200101', periods=6) , columns=list('ABCD')) # index为行索引,column为列索引;randn产生标准正态分布的随机数
df

输出结果:

A B C D
2020-01-01 -1.749765 0.342680 1.153036 -0.252436
2020-01-02 0.981321 0.514219 0.221180 -1.070043
2020-01-03 -0.189496 0.255001 -0.458027 0.435163
2020-01-04 -0.583595 0.816847 0.672721 -0.104411
2020-01-05 -0.531280 1.029733 -0.438136 -1.118318
2020-01-06 1.618982 1.541605 -0.251879 -0.842436
df.drop(columns='D') 

输出结果:

A B C
2020-01-01 -1.749765 0.342680 1.153036
2020-01-02 0.981321 0.514219 0.221180
2020-01-03 -0.189496 0.255001 -0.458027
2020-01-04 -0.583595 0.816847 0.672721
2020-01-05 -0.531280 1.029733 -0.438136
2020-01-06 1.618982 1.541605 -0.251879
df #使用drop,df并没有任何变化

输出结果:

A B C D
2020-01-01 -1.749765 0.342680 1.153036 -0.252436
2020-01-02 0.981321 0.514219 0.221180 -1.070043
2020-01-03 -0.189496 0.255001 -0.458027 0.435163
2020-01-04 -0.583595 0.816847 0.672721 -0.104411
2020-01-05 -0.531280 1.029733 -0.438136 -1.118318
2020-01-06 1.618982 1.541605 -0.251879 -0.842436

89.删除其中两列数据

df.drop(labels=['A','B'],axis=1) #删除AB列

输出结果:

C D
2020-01-01 1.153036 -0.252436
2020-01-02 0.221180 -1.070043
2020-01-03 -0.458027 0.435163
2020-01-04 0.672721 -0.104411
2020-01-05 -0.438136 -1.118318
2020-01-06 -0.251879 -0.842436

90.删除重复行

df = pd.DataFrame([{'a': 1, 'b': 1},
                   {'a': 1, 'b': 1},
                   {'a': 3, 'b': 6}])
df

输出结果:

a b
0 1 1
1 1 1
2 3 6
df.drop_duplicates()

输出结果:

a b
0 1 1
2 3 6

91.任意列求和

df['a'].sum() #还是啊按照drop之前的df求和,drop并不会改变之前的df。

输出结果:

5

92.只保留每个消费者的最近日期的数据

df=pd.DataFrame({'姓名': ['张三', '李四', '张三'],
                 '身份证': [111111111111111111, 222222222222222222, 111111111111111111],
                 '消费日期': [20200103, 20200128, 20200108]})
df

输出结果:

姓名 身份证 消费日期
0 张三 111111111111111111 20200103
1 李四 222222222222222222 20200128
2 张三 111111111111111111 20200108
df.sort_values('消费日期',ascending=0).drop_duplicates('身份证',keep='first')#drop_duplicates删除重复;keep='first'意思是不删除第一个重复的项

输出结果:

姓名 身份证 消费日期
1 李四 222222222222222222 20200128
2 张三 111111111111111111 20200108

92.区分及格与不及格的学生

df = pd.DataFrame({'name': ['张三', '李四', '林明', '李红', '李华',
                            '孙小兰', '赵丽丽', '王娜'],
                   'grades': [58, 83, 79, 65, 93, 45, 61, 88]})
df

输出结果:

name grades
0 张三 58
1 李四 83
2 林明 79
3 李红 65
4 李华 93
5 孙小兰 45
6 赵丽丽 61
7 王娜 88
def choice(x):
    if x >= 60:
        return '及格'
    else:
        return '不及格'


df.grades = pd.Series(map(lambda x: choice(x), df.grades))
df 
# map()是Series对象的一个函数,DataFrame中没有map(),map()是将自定义函数作用于Series对象的每个元素,即df.grades
# lambda是匿名函数,冒号左侧是变量,冒号右侧是定义的函数规则

输出结果:

name grades
0 张三 不及格
1 李四 及格
2 林明 及格
3 李红 及格
4 李华 及格
5 孙小兰 不及格
6 赵丽丽 及格
7 王娜 及格

93.将缺失值按差值拟合

df = pd.DataFrame({'客户': ['张三_上海', '李四_深圳', '王二_南京',
                               '张红_广州', '李华_天津'],
                   '购买量': [10, np.nan, 30, np.nan, 50]}) 
df 

输出结果:

客户 购买量
0 张三_上海 10.0
1 李四_深圳 NaN
2 王二_南京 30.0
3 张红_广州 NaN
4 李华_天津 50.0
df['购买量'] = df['购买量'].interpolate().astype(int) #astype转换成int型
df #DataFrame差值函数,自动按照10的间隔补NaN(也可改成[10, np.nan, 50, np.nan, 90])试试效果

输出结果:

客户 购买量
0 张三_上海 10
1 李四_深圳 20
2 王二_南京 30
3 张红_广州 40
4 李华_天津 50

94.将一列拆分成两列

df1=df['客户'].str.split('_',expand=True)#或者写成df.客户.str.split('_',expand=True);expand表示是否把series类型转化为DataFrame类型
df1.columns = ['客户', '城市']
df1

输出结果:

客户 城市
0 张三 上海
1 李四 深圳
2 王二 南京
3 张红 广州
4 李华 天津

95.将拆分之后的两列加入原数据中并删除拆分前的这列

df2=df.drop('客户',axis=1)#或者df1=df.drop(columns='客户')
df2

输出结果:

购买量
0 10
1 20
2 30
3 40
4 50
df2.join(df1)

输出结果:

购买量 客户 城市
0 10 张三 上海
1 20 李四 深圳
2 30 王二 南京
3 40 张红 广州
4 50 李华 天津




以上题型是本人在学习pandas中文网的过程中认认真真整理下来的。
感谢pandas中文网!
https://www.pypandas.cn/

大家在学习过程中如果发现不正确的地方,欢迎指正!共同进步!

原创:CSDN:大沐沐

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读