python—数据分析(一)

pandas模块:

  • Pandas 的数据结构:Pandas 主要有Series(一维数组),DataFrame(二维数组),Panel(三维数组),Panel4D(四维数组),PanelND(更多维数组)等数据结构。 其中 SeriesDataFrame 应用的最为广泛。
  1. Series 是一维带标签的数组,它可以包含任何数据类型。包括整数,字符串,浮点数,Python 对象等。所以Series 可以通过标签来定位。
  2. DataFrame 是二维的带标签的数据结构。我们可以通过标签来定位数据。这是 NumPy 所没有的。
  • Pandas 中,Series 可以被看作由 1 列数据组成的数据集。Series语法为:
    s = pd.Series(data, index=index)
# 从列表创建Series
arr = [8, 7, 2, 3, 4]
s1 = pd.Series(arr)  # 如果不指定索引,则默认从0开始到N-1
# print(s1)

import numpy as np
n = np.random.random(5)  # 创建一个随机数组n
index = ['a', 'b', 'c', 'd', 'e']
# print(pd.Series(n, index=index))  # n为索引对象,index=index指定索引
# 从字典创建Series
dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
# print(pd.Series(dict))

1.Series的基本操作

  • 修改Series的索引
import pandas as pd

s = [1, 5, 6, 8, 9]
index = ['a', 'b', 'c', 'd', 'e']
a = pd.Series(s, index=index)
print(a)
a.index = ['A', 'B', 'C', 'D', 'E']  # 索引通过赋值的方式修改索引值
print(a)

输出为
a 1
b 5
c 6
d 8
e 9
dtype: int64
A 1
B 5
C 6
D 8
E 9
dtype: int64

  • Series根据运算的索引标签自动对齐数据
import pandas as pd

a = [1, 2, 3, 4, 5]
dict = {'ab':55, 'hb':99, "ds":97, 'age':18}
dict1 = ['ab', 'hb', 'ds', 'year']
s1 = pd.Series(dict)
s2 = pd.Series(dict, index=dict1)
print(s1)
print(s2)
print(s1 + s2)
# print(s1.append(s2))  # 竖向连接(在某些版本的pandas中append方法已经弃用了)

输出为
ab 55
hb 99
ds 97
age 18
dtype: int64
ab 55.0
hb 99.0
ds 97.0
year NaN
dtype: float64
ab 110.0
age NaN
ds 194.0
hb 198.0
year NaN
dtype: float64

  • 按指定索引删除元素
import pandas as pd

a = [1, 2, 3, 4, 5]
index = ['a', 'b', 'c', 'd', 'e']
s = pd.Series(a, index=index)
print(s)
s1 = s.drop('e')  # 删除索引为 e 的值
print(s1)

输出为
a 1
b 2
c 3
d 4
e 5
dtype: int64
a 1
b 2
c 3
d 4
dtype: int64

  • 修改指定索引元素
import pandas as pd

a = [1, 2, 3, 4, 5]
index = ['a', 'b', 'c', 'd', 'e']
s = pd.Series(a, index=index)
print(s)
s['a'] = 77
print(s)

输出为
a 1
b 2
c 3
d 4
e 5
dtype: int64
a 77
b 2
c 3
d 4
e 5
dtype: int64

  • 按照指定索引查找元素
import pandas as pd

a = [1, 2, 3, 4, 5]
index = ['a', 'b', 'c', 'd', 'e']
s = pd.Series(a, index=index)
print(s)
print(s['b'])  # 通过索引的方式选取Series中单一值
print(s[['b', 'd', 'e']])  # 通过索引的方式选取Series中一组值
# 类似于numpy的运算(会根据bool型数组进行过滤、标量乘法,应用数学函数等)都会保留索引值
# print(s[s > 3])
# print(s*3)
# print(np.exp(s))

输出为
a 1
b 2
c 3
d 4
e 5
dtype: int64
2
b 2
d 4
e 5
dtype: int64

  • Series的切片操作
import pandas as pd

a = [1, 2, 3, 4, 5]
index = ['a', 'b', 'c', 'd', 'e']
s = pd.Series(a, index=index)
print(s)
print(s[:3])  # 对s的前3个数据访问(跟前面列表的切片操作一样)

输出为
a 1
b 2
c 3
d 4
e 5
dtype: int64
a 1
b 2
c 3
dtype: int64

  • 从字典创建Series
import pandas as pd
from pandas import DataFrame, Series

dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
print(pd.Series(dict))
# Series可以看成一个定长的有序字典,所查询的索引值是到数据值的一个映射
print('b' in s)  # 输出值为bool值
# 传入新排好序列字典的key从而改变原先字典的顺序,若传入的某些健key与原先的字典无相匹配,无值就输出NaN(非数字(not a number))
dict1 = ['b', 'e', 'a', 'd', 'f']  # 原字典中c不在新排的序列dict1中,输出新Serise被删除
print(pd.Series(dict, index=dict1))
# pandas中isnull(对应False不缺失)和notnull(对应是True不缺失)函数可用于检测数据的缺失
print(pd.isnull(pd.Series(dict, index=dict1)))  # 等价于用Series.isull()即print(pd.Series(dict, index=dict1).isnull())
#print(pd.notnull(pd.Series(dict, index=dict1)))

输出为:
a 1
b 2
c 3
d 4
e 5
dtype: int64
True
b 2.0
e 5.0
a 1.0
d 4.0
f NaN
dtype: float64
b False
e False
a False
d False
f True
dtype: bool

  • Series运算
import pandas as pd
from pandas import DataFrame, Series
d1 = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}  # 定义示例字典
d2 = {'1': 5, '2': 2, 'c': 10, 'd': 14}
s1 = pd.Series(d1)
s2 = pd.Series(d2)
# 加法运算(对应健key的值相加)
print(s2.add(s1))  # Series 的加法运算是按照索引计算,如果索引不同则填充为 NaN(空值)
# 减法运算(对应健key的值相减)
print(s2.sub(s1))  # 索引不同则填充为 NaN(空值)
# 乘法运算(对应健key的值相乘)
print(s2.mul(s1))  # 索引不同则填充为 NaN(空值)
# 除法运算(对应健key的值相除)
print(s2.div(s1))  # 索引不同则填充为 NaN(空值)
# 求中位数
print(s1.median())  # 输出为3.0
# 求和
print(s1.sum())  # 输出为15
# 求最大值
print(s1.max())  # 输出为5
# 求最小值
print(s1.min())  # 输出为1

2.DateFrame

DataFrame是一个表格型的数据结构,含有一组有序的列,每列的值类型可以不同(数值、char、bool等)。不仅有行索引还有列索引,可以看作由Series组成地字典。数据是由一个或多个二维块存放的,不是列表、字典或别的一维数据结构。
语法格式: pd.DataFrame( data, index, columns, dtype, copy)
date表示传入的数据
index和columns 行索引和列索引(格式为[‘x1’,‘x2’])
dtype为列的类型
copy是从input输入中拷贝数据(默认是false,不拷贝)。

  • 通过numpy数组创建DateFrame
import pandas as pd
import numpy as np
from pandas import DataFrame
# 通过NUmpy数组创建DataFrame
# dates = pd.date_range('today', periods=6)  # 定义时间序列作为 index
dates = ['range1', 'range2', 'range3', 'range4', 'range5', 'range6']
date = np.random.randn(6, 4)  # 传入 numpy 随机数组6行4列
index = ['A', 'B', 'C', 'D']  # 将列表作为列名
frame = pd.DataFrame(date, index=dates, columns=index)
print(frame)

输出为

ABCD
range11.348870-1.819609-0.967384-0.074994
range20.125211-0.223506-1.410466-1.301604
range30.3643051.0490241.6333631.651079
range4-0.1888070.4251930.0876380.074730
range5-1.507986-0.3015480.9504230.296719
range6-0.636797-0.490917-0.4864110.462784
  • 通过字典数组创建 DataFrame
date =  {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
        'year': [2000, 2001, 2002, 2001, 2002, 2003],
        'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
frame = pd.DataFrame(date)  # 未定义索引,索引从0到N-1排序
print(frame)

输出为

stateyearpop
0Ohio20001.5
1Ohio20011.7
2Ohio20023.6
3Nevada20012.4
4Nevada20022.9
5Nevada20033.2
  • 如果嵌套字典传给DataFrame,pandas就会被解释为:外层字典的键作为列,内层键则作为行索引:
pop = {'Nevada': {2001: 2.4, 2002: 2.9}, 'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}
frame = pd.DataFrame(pop)
print(frame)

输出为

NevadaOhio
20012.41.7
20022.93.6
2000NaN1.5
  • DataFrame的基本操作
部分代码功能说明
DataFrame()创建一个DataFrame对象
frame.values返回ndarray类型的对象
frame.iloc[ 行序,列序 ]按序值返回元素
frame.loc[ 行索引,列索引 ]按索引返回元素
frame.index获取行索引
frame.columns获取列索引
frame.axes获取行及列索引
frame.T行与列对换
frame. info()打印DataFrame对象的信息
frame.head(i)显示前 i 行数据
frame.tail(i)显示后 i 行数据
frame.describe()查看数据按列的统计信息
del frame[‘xx’]关键字删除某xx列项
import pandas as pd
import numpy as np
from pandas import DataFrame
#  通过字典数组创建 DataFrame
date =  {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
        'year': [2000, 2001, 2002, 2001, 2002, 2003],
        'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
frame = pd.DataFrame(date)  # 未定义索引,索引从0到N-1排序
print(frame)

 1. # 预览 DataFrame 的前 5 行数据

# print(frame.head())

 2. # 如果指定序列则按照指定顺序进行排序

# print(pd.DataFrame(date, columns=['year', 'state', 'pop']))  # columns对应是列名

 3. # 查看 DataFrame 的后 3 行数据

# print(frame.tail(3))  # 查看后面第几行数据用tail(n)函数

 4. # 查看DataFrame的索引

# print(frame.index)

5. # 查看DataFrame的列名

# print(frame.columns)

 6. # 查看 DataFrame的数值(跟Series一样,values属性也会以二维ndarray的形式返回DataFrame中的数据)

# print(frame.values)

7. # 查看DataFrame的统计数据

# print(frame.describe())  # 可以看到frame中count数量、mean、std、min、25%、50%、75%、max对应的数值

 8. # DataFrame转置操作

# print(frame.T)  # 相当于线性代数的转置,把列变成行,行变成列

 9. # 对DataFrame进行按照列排序

# print(frame.sort_values(by='pop'))  # 按照by='XX'升序排列

10. # 对DataFrame数据切片

# print(frame[1:3])  # 取1<frame<3的数据

 11. # 对DataFrame通过位置查询

# print(frame.iloc[1:3])  # 查询2,3行

 12. # 对DataFrame通过标签进行查询(单列)从而获取一个Series

# print(frame['year'])  # 输出是查询某列名的数据,另外可以写成frame.year(只适用于一个合理的python变量名才适用)

 13. # 通过位置或者是名称方式进行获取

# print(frame.loc('0'))

 14. # 对DataFrame进行多列标签查询

# print(frame[['year', 'pop']])  # 传入一个列名组成的列表

 15.# 生成 DataFrame 副本,方便数据集被多个不同流程使用(副本拷贝copy)

# print(frame.copy())

 16. # 判断DataFrame是否为空

# print(frame.isnull())  # 如果为空则返回为 True,notnull()函数为空返回False

 17. # 添加列数据(用Series一维数组添加进去DataFrame的列数据)

num = pd.Series([44,11,22,33,44,'NaN'], index=frame.index)  # 添加列数据的索引还是用frame的索引,若有值为空的都被填上缺失值NaN
frame['number'] = num  # 添加以 'number' 为列名的新数据列
# print(frame)

 18. # 新传入的列若找不到数据匹配,则将以NaN值输出

# frame2 = pd.DataFrame(date, index=['one', 'two', 'three', 'four', 'five', 'six'],
#                        colums=['year', 'state', 'pop', 'debt'])
# print(frame2)

 19. # 对DataFrame进行求平均值

# print(frame.mean())  # 只对为数值的列进行求平均值

 20. # 对DataFrame任意列进行求和操作

# print(frame['year'].sum())

 21. # 关键字del用于删除列

# del frame['number']  # 删除number列
# print(frame)

 22. # 打印DataFrame对象的信息

# print(frame.info())
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白只对大佬的文章感兴趣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值