Loading

Pandas模块

1 Pandas基础

1.1 数据结构

1.1.1 Series 一维

#创建
#1.列表创建
>>> pd.Series(['a','b','c','d'])
0    a
1    b
2    c
3    d
dtype: object
#2.设置索引index
>>> pd.Series(['a','b','c','d'],index=['z1','z2','z3','z4'])
z1    a
z2    b
z3    c
z4    d
dtype: object
#3.字典创建
>>> pd.Series({'z1':'a','z2':'b','z3':'c','z4':'d'})
z1    a
z2    b
z3    c
z4    d
dtype: object
#索引
>>> se
z1    a
z2    b
z3    c
z4    d
dtype: object
#1.位置索引
dtype: object
>>> se[0]
'a'
#2.标签索引
>>> se['z1']
'a'
#3.切片索引
>>> se[1:4]
z2    b
z3    c
z4    d
dtype: object
#属性index和values
>>> se.index
Index(['z1', 'z2', 'z3', 'z4'], dtype='object')
>>> se.values
array(['a', 'b', 'c', 'd'], dtype=object)

1.1.2 DataFrame 二维

#创建对象
#1.列表创建
>>> pd.DataFrame([['John',60],['Amy',99],['Jack',80]])
      0   1
0  John  60
1   Amy  99
2  Jack  80
#2.列标签columns,行标签index
>>> pd.DataFrame([['John',60],['Amy',99],['Jack',80]],columns=['name','score'],index=['s01','s02','s03'])
     name  score
s01  John     60
s02   Amy     99
s03  Jack     80
#dataframe属性
>>> df.values
array([['John', 60],
       ['Amy', 99],
       ['Jack', 80]], dtype=object)
>>> df.dtypes
name     object
score     int64
dtype: object
>>> df.index
Index(['s01', 's02', 's03'], dtype='object')
>>> df.columns
Index(['name', 'score'], dtype='object')
>>> df.T
        s01  s02   s03
name   John  Amy  Jack
score    60   99    80
Index(['name', 'score'], dtype='object')
>>> df.head() # 查看前n条,默认5条
     name  score
s01  John     60
s02   Amy     99
s03  Jack     80
>>> df.head(2)
     name  score
s01  John     60
s02   Amy     99
>>> df.tail() # 查看后n条,默认5条
     name  score
s01  John     60
s02   Amy     99
s03  Jack     80
>>> df.tail(2)
     name  score
s02   Amy     99
s03  Jack     80
>>> df.shape
(3, 2)
>>> df.info() #查看索引,数据类型和内存信息
Index: 3 entries, s01 to s03
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   name    3 non-null      object
 1   score   3 non-null      int64
dtypes: int64(1), object(1)
memory usage: 180.0+ bytes

1.2 读取数据

#读取Excel
df=pd.read_excel('name.xlsx',sheet_name='表名',
                  header=表头所在行数,数据本身不包含列名则header=None,
                  index_col=以第n列的数据作为索引,
                  nrows=读取前n行数据,
                  usecols=选中的列,此处的列表表示的不是范围,
                  skiprows=省略指定行数的数据,从第一行开始
                  )
>>> df=pd.read_excel('数据2.xlsx',sheet_name='Sheet1')
>>> df
           中文名                 外文名 性别    国籍     身高     体重    项目   省份
0    阿尔法拉克·阿米奴     Al-Farouq Aminu  男  尼日利亚  206厘米   98kg    篮球  NaN 
1      安德森•瓦莱乔    Anderson Varejao  男    巴西  211厘米  118kg    篮球  NaN     
2          博涅娃    BONEVA Antoaneta  女  保加利亚    NaN    NaN    射击  NaN        
3       阿隆·贝内斯         Aron Baynes  男  澳大利亚  208厘米  118kg    篮球  NaN    
4      埃米莉·西博姆  Emily Jane Seebohm  女  澳大利亚  1.80米   64kg    游泳  NaN    
..         ...                 ... ..   ...    ...    ...   ...  ...
229     罗贝塔·文奇       Roberta Vinci  女   意大利    NaN    NaN    网球  NaN       
230        梁美玉         Liang meiyu  女    中国  166cm   65kg   曲棍球   广东       
231        罗晓玲        Luo Xiaoling  女    中国    NaN    NaN   自行车   甘肃       
232        李雪芮          Li Xue Rui  女    中国  173厘米   65kg   羽毛球   重庆     
233       拉菲尼亚              Rafael  男    巴西  178cm   75kg  男子足球  NaN       

[234 rows x 8 columns]

>>> df=pd.read_excel('数据2.xlsx',sheet_name='Sheet1',index_col=1,usecols=[0,1,2,5],nrows=6)
>>> df
                          中文名 性别     体重
外文名
Al-Farouq Aminu     阿尔法拉克·阿米奴  男   98kg
Anderson Varejao      安德森•瓦莱乔  男  118kg
BONEVA Antoaneta          博涅娃  女    NaN
Aron Baynes            阿隆·贝内斯  男  118kg
Emily Jane Seebohm    埃米莉·西博姆  女   64kg
Bahar Caglar         巴哈尔·卡格拉尔  女   76kg
#读取csv 同excel

1.3 选择数据

#loc 以列名和行名作为参数
>>> df
          中文名                 外文名 性别     体重
p1  阿尔法拉克·阿米奴     Al-Farouq Aminu  男   98kg
p2    安德森•瓦莱乔    Anderson Varejao  男  118kg
p3        博涅娃    BONEVA Antoaneta  女    NaN
p4     阿隆·贝内斯         Aron Baynes  男  118kg
p5    埃米莉·西博姆  Emily Jane Seebohm  女   64kg
p6   巴哈尔·卡格拉尔        Bahar Caglar  女   76kg
>>> df.loc['p3']
中文名                 博涅娃
外文名    BONEVA Antoaneta
性别                    女
体重                  NaN
Name: p3, dtype: object
>>> df.loc['p3']['中文名']
'博涅娃'
>>> df.loc[['p2','p3']]
        中文名               外文名 性别     体重
p2  安德森•瓦莱乔  Anderson Varejao  男  118kg
p3      博涅娃  BONEVA Antoaneta  女    NaN
>>> df.loc[:,['中文名','性别']]
          中文名 性别
p1  阿尔法拉克·阿米奴  男
p2    安德森•瓦莱乔  男
p3        博涅娃  女
p4     阿隆·贝内斯  男
p5    埃米莉·西博姆  女
p6   巴哈尔·卡格拉尔  女
>>> df.loc[['p2','p3'],['中文名','性别']]
        中文名 性别
p2  安德森•瓦莱乔  男
p3      博涅娃  女
#iloc 以行和列位置索引作为参数
>>> df.iloc[2]
中文名                 博涅娃
外文名    BONEVA Antoaneta
性别                    女
体重                  NaN
Name: p3, dtype: object
>>> df.iloc[2][1]
'BONEVA Antoaneta'

1.4 修改行标签和列标签

#直接修改df.index属性
>>> df.index
Index(['p1', 'p2', 'p3', 'p4', 'p5', 'p6'], dtype='object')
>>> df.index=list('123456')
>>> df.index
Index(['1', '2', '3', '4', '5', '6'], dtype='object')
#用df.rename()函数
>>> df.rename(columns={'外文名':'英文名'},index={'1':'a1','2':'a2','3':'a3'},in
>>> df
          中文名                 英文名 性别     体重
a1   阿尔法拉克·阿米奴     Al-Farouq Aminu  男   98kg
a2    安德森•瓦莱乔    Anderson Varejao  男  118kg
a3        博涅娃    BONEVA Antoaneta  女    NaN
4     阿隆·贝内斯         Aron Baynes  男  118kg
5     埃米莉·西博姆  Emily Jane Seebohm  女   64kg
6    巴哈尔·卡格拉尔        Bahar Caglar  女   76kg

2 Pandas数据操作

2.1 数据的运算

#sum();mean();max();min()
>>> df
          name  price  into_price
a1    football     50          20
a2  volleyball     30          10
a3     clothes    100          50
>>> df.sum()
name          footballvolleyballclothes
price                               180
into_price                           80
dtype: object
>>> df['price'].sum()
180
>>> df['price'].mean()
60.0
>>> df.max()
name          volleyball
price                100
into_price            50
dtype: object
>>> df.min()
name          clothes
price              30
into_price         10
dtype: object
#标准差std();分位数quantile();众数mode();偏度skew();峰度kurt()
#describe()
>>> df.describe()
            price  into_price
count    3.000000    3.000000
mean    60.000000   26.666667
std     36.055513   20.816660
min     30.000000   10.000000
25%     40.000000   15.000000
50%     50.000000   20.000000
75%     75.000000   35.000000
max    100.000000   50.000000
#创建数据透视表
pands.pivot_table()
(DataFrame,values='利润(元)',index='产品',aggfunc='sum')


2.2 数据格式化

#round()设置小数位数
>>> data=df.describe()
>>> data
count    3.000000    3.000000
mean    60.000000   26.666667
std     36.055513   20.816660
min     30.000000   10.000000
25%     40.000000   15.000000
50%     50.000000   20.000000
75%     75.000000   35.000000
max    100.000000   50.000000
>>> data.round(2)
        price  into_price
count    3.00        3.00
mean    60.00       26.67
std     36.06       20.82
min     30.00       10.00
25%     40.00       15.00
50%     50.00       20.00
75%     75.00       35.00
max    100.00       50.00
#apply()和format()设置百分比
>>> df=pd.DataFrame(np.random.rand(5,4),columns=['a1','a2','a3','a4'])
>>> df
         a1        a2        a3        a4
0  0.413184  0.860106  0.457123  0.754140
1  0.782250  0.670121  0.815621  0.480721
2  0.076142  0.667198  0.948922  0.868905
3  0.882197  0.739716  0.005118  0.328356
4  0.158483  0.240296  0.116620  0.098929
>>> df['%%%']=df['a1'].apply(lambda x:format(x,'.0%'))
>>> df
         a1        a2        a3        a4  %%%
0  0.413184  0.860106  0.457123  0.754140  41%
1  0.782250  0.670121  0.815621  0.480721  78%
2  0.076142  0.667198  0.948922  0.868905   8%
3  0.882197  0.739716  0.005118  0.328356  88%
4  0.158483  0.240296  0.116620  0.098929  16%

2.3 数据表的处理

#转置df.T
>>> df
         中文名               外文名 性别     体重
0  阿尔法拉克·阿米奴   Al-Farouq Aminu  男   98kg
1    安德森•瓦莱乔  Anderson Varejao  男  118kg
2        博涅娃  BONEVA Antoaneta  女    NaN
3     阿隆·贝内斯       Aron Baynes  男  118kg
>>> df.T
                   0                 1                 2            3
中文名        阿尔法拉克·阿米奴           安德森•瓦莱乔               博 涅娃       阿隆·贝内斯
外文名  Al-Farouq Aminu  Anderson Varejao  BONEVA Antoaneta  Aron Baynes
性别                 男                 男                 女            男
体重              98kg             118kg               NaN        118kg

#转换为树形结构:行标签不变,列标签也变为行标签,为二维表格建立层次化索引
>>> df.stack()
0  中文名           阿尔法拉克·阿米奴
   外文名     Al-Farouq Aminu
   性别                    男
   体重                 98kg
1  中文名             安德森•瓦莱乔
   外文名    Anderson Varejao
   性别                    男
   体重                118kg
2  中文名                 博涅娃
   外文名    BONEVA Antoaneta
   性别                    女
3  中文名              阿隆·贝内斯
   外文名         Aron Baynes
   性别                    男
   体重                118kg
dtype: object
#数据表的拼接:merge()\concat()\append()
>>> df1
         中文名               外文名 性别     体重
0  阿尔法拉克·阿米奴   Al-Farouq Aminu  男   98kg
1    安德森•瓦莱乔  Anderson Varejao  男  118kg
2        博涅娃  BONEVA Antoaneta  女    NaN
>>> df2
         中文名             外文名 性别     体重
6  安德烈斯·诺西奥尼  Andres Nocioni  男  102kg
7      安迪·穆雷     Andy Murray  男   81kg
8         波尔       Timo Boll  男   65kg
9   艾克内·伊贝克维    Ekene Ibekwe  男  100kg
#
pandas.merge(left=DataFrame,right=DataFrame,
               how={'left','right','outer','inner','cross'}, default'inner',
               'inner':将两个表主键一致的信息拼接在一起
               'outer':保留两个表的所有信息,拼接时不能对齐处,用NaN填充
               'left':保留左表所有信息,把右表中主键与左表一致的信息拼接进来,标签不能对齐的部分用NaN填充
               'right':同上
               on=None   确定作为主键的字段
               left_index=False,
               right_index=False,
               改为True表示用左表和右表的共同索引列拼接
               )
#pandas.concat()
#1.相同字段的两个表进行首尾合并
>>> pd.concat([df1,df2]{,ignore_index=True})
         中文名               外文名 性别     体重
0  阿尔法拉克·阿米奴   Al-Farouq Aminu  男   98kg
1    安德森•瓦莱乔  Anderson Varejao  男  118kg
2        博涅娃  BONEVA Antoaneta  女    NaN
6  安德烈斯·诺西奥尼    Andres Nocioni  男  102kg
7      安迪·穆雷       Andy Murray  男   81kg
8         波尔         Timo Boll  男   65kg
9   艾克内·伊贝克维      Ekene Ibekwe  男  100kg
#2.列名称不一致时的横向合并,可以设置axis=1,缺失值填充NaN
#3.交叉合并,设置join='outer'取并集,join='inner'取交集,缺失值填充NaN
>>> df1=pd.DataFrame({"id":['a1','a2','a3'],"name":['Amy','Jenny','John']})
>>> df1
   id   name
0  a1    Amy
1  a2  Jenny
2  a3   John
>>> df2=pd.DataFrame({"id":['a1','a5'],"name":['Amy','Charle']})
>>> df2
   id    name
0  a1     Amy
1  a5  Charle
>>> pd.concat([df1,df2],axis=1,join='inner')
   id    name  id    name
0  a1     Amy  a1     Amy
1  a5  Charle  a5  Charle
>>> pd.concat([df1,df2],axis=1,join='outer')
   id   name   id    name
0  a1    Amy   a1     Amy
1  a2  Jenny   a5  Charle
2  a3   John  NaN     NaN
#append()
>>> df1._append(df2)
   id    name
0  a1     Amy
1  a2   Jenny
2  a3    John
0  a1     Amy
1  a5  Charle
>>> df1._append(df2,ignore_index=True)
   id    name
0  a1     Amy
1  a2   Jenny
2  a3    John
3  a1     Amy
4  a5  Charle
#merge():合并数据结构中的列,根据列的内容来合并
#concat():合并具有相同列的数据结构,简单地连接数据结构

2.4 数据移位

#shift()返回向下移位以后的数据
>>> df
   score
0     10
1     22
2     36
>>> df.shift()
   score
0    NaN
1   10.0
2   22.0
posted @ 2023-11-10 15:25  chenelm  阅读(51)  评论(0)    收藏  举报