学习篇之数据分析库pandas

本文详细介绍了数据分析库pandas的核心概念,包括Series和DataFrame数据结构的创建及属性,索引与切片操作,布尔型索引,数据查看、转置、添加、修改和删除值,排序,数值计算和统计基础。此外,还探讨了字符串处理,合并、连接、去重和替换操作,以及数据分组和读取数据的方法。这是一篇全面学习pandas的实用教程。
摘要由CSDN通过智能技术生成
import numpy as np
import pandas as pd  
#导入numpy、pandas模块

Series 数据结构(带有标签的一维数组)

# Series 是带有标签的一维数组,可以保存任何数据类型(整数,字符串,浮点数,Python对象等),轴标签统称为索引

s = pd.Series(np.random.rand(5))
print(s)
print(type(s))
# 查看数据、数据类型

print(s.index,type(s.index))
print(s.values,type(s.values))
# .index查看series索引,类型为rangeindex
# .values查看series值,类型是ndarray

# 核心:series相比于ndarray,是一个自带索引index的数组 → 一维数组 + 对应索引
# 所以当只看series的值的时候,就是一个ndarray
# series和ndarray较相似,索引切片功能差别不大
# series和dict相比,series更像一个有顺序的字典(dict本身不存在顺序),其索引原理与字典相似(一个用key,一个用index)


0    0.467169
1    0.054509
2    0.965586
3    0.507866
4    0.694997
dtype: float64
<class 'pandas.core.series.Series'>
RangeIndex(start=0, stop=5, step=1) <class 'pandas.core.indexes.range.RangeIndex'>
[0.46716932 0.05450883 0.96558627 0.50786619 0.69499677] <class 'numpy.ndarray'>

Series 创建方法一:由字典创建,字典的key就是index,values就是values

dic = {'a':1 ,'b':2 , 'c':3, '4':4, '5':5}
s = pd.Series(dic)
print(s)
# 注意:key肯定是字符串,假如values类型不止一个会怎么样? → dic = {'a':1 ,'b':'hello' , 'c':3, '4':4, '5':5}

4    4
5    5
a    1
b    2
c    3
dtype: int64

Series 创建方法二:由数组创建(一维数组)

arr = np.random.randn(5)
s = pd.Series(arr)
print(arr)
print(s)
# 默认index是从0开始,步长为1的数字

s = pd.Series(arr, index = ['a','b','c','d','e'],dtype = np.object)
print(s)
# index参数:设置index,长度保持一致
# dtype参数:设置数值类型

[-2.56328023  0.87233579  0.47630666  1.91715736 -1.26924024]
0   -2.563280
1    0.872336
2    0.476307
3    1.917157
4   -1.269240
dtype: float64
a    -2.56328
b    0.872336
c    0.476307
d     1.91716
e    -1.26924
dtype: object

Series 名称属性:name

s1 = pd.Series(np.random.randn(5))
print(s1)
print('-----')
s2 = pd.Series(np.random.randn(5),name = 'test')
print(s2)
print(s1.name, s2.name,type(s2.name))
# name为Series的一个参数,创建一个数组的 名称
# .name方法:输出数组的名称,输出格式为str,如果没用定义输出名称,输出为None

s3 = s2.rename('hehehe')
print(s3)
print(s3.name, s2.name)
# .rename()重命名一个数组的名称,并且新指向一个数组,原数组不变

0   -1.285306
1   -0.586416
2   -1.966362
3   -1.507387
4    0.622088
dtype: float64
-----
0   -0.763427
1   -1.588831
2   -1.676116
3    0.453159
4   -0.874990
Name: test, dtype: float64
None test <class 'str'>
0   -0.763427
1   -1.588831
2   -1.676116
3    0.453159
4   -0.874990
Name: hehehe, dtype: float64
hehehe test

Dataframe 数据结构(带有行列标签的二维数组)

# Dataframe是一个表格型的数据结构,“带有标签的二维数组”。
# Dataframe带有index(行标签)和columns(列标签)

data = {'name':['Jack','Tom','Mary'],
        'age':[18,19,20],
       'gender':['m','m','w']}
frame = pd.DataFrame(data)
print(frame)  
print(type(frame))
print(frame.index,'\n该数据类型为:',type(frame.index))
print(frame.columns,'\n该数据类型为:',type(frame.columns))
print(frame.values,'\n该数据类型为:',type(frame.values))
# 查看数据,数据类型为dataframe
# .index查看行标签
# .columns查看列标签
# .values查看值,数据类型为ndarray

   age gender  name
0   18      m  Jack
1   19      m   Tom
2   20      w  Mary
<class 'pandas.core.frame.DataFrame'>
RangeIndex(start=0, stop=3, step=1) 
该数据类型为: <class 'pandas.core.indexes.range.RangeIndex'>
Index(['age', 'gender', 'name'], dtype='object') 
该数据类型为: <class 'pandas.core.indexes.base.Index'>
[[18 'm' 'Jack']
 [19 'm' 'Tom']
 [20 'w' 'Mary']] 
该数据类型为: <class 'numpy.ndarray'>

创建方式三种

  • 由数组/list组成的字典
  • 由Series组成的字典
  • 通过二维数组直接创建

Dataframe 创建方法一:由数组/list组成的字典

# 创建方法:pandas.Dataframe()

data1 = {'a':[1,2,3],
        'b':[3,4,5],
        'c':[5,6,7]}
data2 = {'one':np.random.rand(3),
        'two':np.random.rand(3)}   # 这里如果尝试  'two':np.random.rand(4) 会怎么样?
print(data1)
print(data2)
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
print(df1)
print(df2)
# 由数组/list组成的字典 创建Dataframe,columns为字典key,index为默认数字标签
# 字典的值的长度必须保持一致!

df1 = pd.DataFrame(data1, columns = ['b','c','a','d'])
print(df1)
df1 = pd.DataFrame(data1, columns = ['b','c'])
print(df1)
# columns参数:可以重新指定列的顺序,格式为list,如果现有数据中没有该列(比如'd'),则产生NaN值
# 如果columns重新指定时候,列的数量可以少于原数据

df2 = pd.DataFrame(data2, index = ['f1','f2','f3'])  # 这里如果尝试  index = ['f1','f2','f3','f4'] 会怎么样?
print(df2)
# index参数:重新定义index,格式为list,长度必须保持一致


{'a': [1, 2, 3], 'b': [3, 4, 5], 'c': [5, 6, 7]}
{'one': array([0.62316529, 0.75502024, 0.07149083]), 'two': array([0.18033469, 0.90637716, 0.6449568 ])}
   a  b  c
0  1  3  5
1  2  4  6
2  3  5  7
        one       two
0  0.623165  0.180335
1  0.755020  0.906377
2  0.071491  0.644957
   b  c  a    d
0  3  5  1  NaN
1  4  6  2  NaN
2  5  7  3  NaN
   b  c
0  3  5
1  4  6
2  5  7
         one       two
f1  0.623165  0.180335
f2  0.755020  0.906377
f3  0.071491  0.644957

Dataframe 创建方法二:由Series组成的字典

data1 = {'one':pd.Series(np.random.rand(2)),
        'two':pd.Series(np.random.rand(3))}  # 没有设置index的Series
data2 = {'one':pd.Series(np.random.rand(2), index = ['a','b']),
        'two':pd.Series(np.random.rand(3),index = ['a','b','c'])}  # 设置了index的Series
print(data1)
print(data2)
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
print(df1)
print(df2)
# 由Seris组成的字典 创建Dataframe,columns为字典key,index为Series的标签(如果Series没有指定标签,则是默认数字标签)
# Series可以长度不一样,生成的Dataframe会出现NaN值

{'two': 0    0.331382
1    0.508265
2    0.615997
dtype: float64, 'one': 0    0.857739
1    0.165800
dtype: float64}
{'two': a    0.826446
b    0.983392
c    0.187749
dtype: float64, 'one': a    0.920073
b    0.215178
dtype: float64}
        one       two
0  0.857739  0.331382
1  0.165800  0.508265
2       NaN  0.615997
        one       two
a  0.920073  0.826446
b  0.215178  0.983392
c       NaN  0.187749

Dataframe 创建方法三:通过二维数组直接创建

ar = np.random.rand(9).reshape(3,3)
print(ar)
df1 = pd.DataFrame(ar)
df2 = pd.DataFrame(ar, index = ['a', 'b', 'c'], columns = ['one','two','three'])  # 可以尝试一下index或columns长度不等于已有数组的情况
print(df1)
print(df2)
# 通过二维数组直接创建Dataframe,得到一样形状的结果数据,如果不指定index和columns,两者均返回默认数字格式
# index和colunms指定长度与原数组保持一致

[[0.33940056 0.77384698 0.25308293]
 [0.28151251 0.02875986 0.7516066 ]
 [0.34746659 0.25245068 0.68979615]]
          0         1         2
0  0.339401  0.773847  0.253083
1  0.281513  0.028760  0.751607
2  0.347467  0.252451  0.689796
        one       two     three
a  0.339401  0.773847  0.253083
b  0.281513  0.028760  0.751607
c  0.347467  0.252451  0.689796

索引与切片(行用 (i)loc,列不用。单列字符串,多列就列表)

Series和Datafram索引的原理一样,我们以Dataframe的索引为主来学习
列索引:df[‘列名’] (Series不存在列索引)
行索引:df.loc[]、df.iloc[]
选择列 / 选择行 / 切片 / 布尔判断

import numpy as np
import pandas as pd  
# 导入numpy、pandas模块

选择行与列

df = pd.DataFrame(np.random.rand(12).reshape(3,4)*100,
                   index = ['one','two','three'],
                   columns = ['a','b','c','d'])
print(df)

data1 = df['a']
data2 = df[['a','c']]
print(data1,type(data1))
print(data2,type(data2))
print('-----')
# 按照列名选择列,只选择一列输出Series,选择多列输出Dataframe

data3 = df.loc['one']
data4 = df.loc[['one','two']]
print(data3,type(data3))
print(data4,type(data4))
# 按照index选择行,只选择一行输出Series,选择多行输出Dataframe




              a          b          c          d
one    12.091343   5.285528  50.926279  43.411861
two    49.502460  68.476758  96.639658  13.522464
three   2.368430  72.006476  65.543572  95.790480
one      12.091343
two      49.502460
three     2.368430
Name: a, dtype: float64 <class 'pandas.core.series.Series'>
               a          c
one    12.091343  50.926279
two    49.502460  96.639658
three   2.368430  65.543572 <class 'pandas.core.frame.DataFrame'>
-----
a    12.091343
b     5.285528
c    50.926279
d    43.411861
Name: one, dtype: float64 <class 'pandas.core.series.Series'>
             a          b          c          d
one  12.091343   5.285528  50.926279  43.411861
two  49.502460  68.476758  96.639658  13.522464 <class 'pandas.core.frame.DataFrame'>


# df[]默认选择列,[]中写列名(所以一般数据colunms都会单独制定,不会用默认数字列名,以免和index冲突)
# 单选列为Series,print结果为Series格式
# 多选列为Dataframe,print结果为Dataframe格式

# 核心笔记:df[col]一般用于选择列,[]中写列名
 #核心笔记:df.loc[label]主要针对index选择行,同时支持指定index,及默认数字index
 #loc与iloc 的区别,前者末端包括,后者不包括,前者’自闭‘

布尔型索引

# 多用于索引行

df = pd.DataFrame(np.random.rand(16).reshape(4,4)*100,
                   index = ['one','two','three','four'],
                   columns = ['a','b','c','d'])
print(df)
print('------')

b1 = df < 20
print(b1,type(b1))
print(df[b1])  # 也可以书写为 df[df < 20]
print('------')
# 不做索引则会对数据每个值进行判断
# 索引结果保留 所有数据:True返回原数据,False返回值为NaN

b2 = df['a'] > 50
print(b2,type(b2))
print(df[b2])  # 也可以书写为 df[df['a'] > 50]
print('------')
# 单列做判断
# 索引结果保留 单列判断为T
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值