一. DataFrame的数据结构
通过二维数组创建
import numpy as np
import pandas as pd
# 1、DataFrame的创建方式
# 1.1 通过二维数组创建
arr = [['张伊曼', 100], ['张诗诗', 90], ['张巧玲', 80]]
df0 = pd.DataFrame(arr)
print("df0===========================")
print(df0)
通过字典创建
# 1.2 通过字典创建
dict0 = {
'android': [90, 80, 60],
'java': [99, 78, 89],
'python': [98, 82, 85],
'c': 80
}
df0 = pd.DataFrame(dict0)
print("df0===========================")
print(df0)
DataFrame的基本属性
# 2、基本属性
arr = [['张伊曼', 100], ['张诗诗', 90], ['张巧玲', 80]]
df0 = pd.DataFrame(arr)
print("df0===========================")
print(df0)
print("df0.index===========================") #如果不指定index的值,就会从默认0开始
print(df0.index)
print("df0.columns===========================") #如果不指定columns的值,就会从默认0开始
print(df0.columns)
print("df0.dtypes===========================") #以列为单位算起
print(df0.dtypes)
print("df0.values===========================")
print(df0.values)
print("更换index、columns的值===========================")
df0 = pd.DataFrame(arr,index=['第一行','第二行','第三行'],columns=['name','分散'])
#df0.index = ['第一行', '第二行', '第三行'] #等同于以这种方式更改index的值
print(df0)
DataFrame的值的获取
介绍几个注意点:
1)索引对象,不管是Series还是DataFrame对象,都有索引对象,他们的自动对齐功能也是通过索引实现的
2)DataFrame可以直接通过列索引获取指定列的数据
3)如果需要获取指定行的数据的话,需要通过ix方法来获取对应行索引的行数据
4)DataFrame可以切片操作
# 3、DataFrame的值的获取
dict0 = {
'android': [90, 80, 60],
'java': [99, 78, 89],
'python': [98, 82, 85],
'c': 80
}
df0 = pd.DataFrame(dict0)
df0.index = ['张伊曼', '张诗诗', '张巧玲']
print("df0===========================")
print(df0)
# print(df0['张伊曼']['android']) #注意:先行后列获取会报错
print("单个的值的获取===========================")
print(df0['android']['张伊曼']) #通过这种方式获取单个的值
print("一行值的获取===========================")
print(df0.ix[0])
print("多行值的获取===========================")
print(df0.ix[:2])
print("任意多行值的获取===========================")
print(df0.ix[:2, :2])
print("一列值的获取===========================")
print(df0['android'])
修改值 新增列 新增行
注意:
1)numpy是不能加新行新列的 但是DataFrame可以
2)修改某个具体对象的值,即可以先列后行 也可以先行后列 最好是先列后行可以自动改变对象的数据类型
# 4、 修改值 新增列 新增行
dict0 = {
'android': [90, 80, 60],
'java': [99, 78, 89],
'python': [98, 82, 85],
'c': 80
}
df0 = pd.DataFrame(dict0)
df0.index = ['张伊曼', '张诗诗', '张巧玲']
print("df0===========================")
print(df0)
print("修改单个值===========================")
df0['android']['张伊曼'] = 100
print(df0)
print("修改一列值===========================")
df0['android'] = [100, 100, 100]
print(df0)
print("新增列===========================")
df0['c++'] = np.nan
print(df0)
print("新增行===========================")
df0.ix['思思'] = np.nan
print(df0)
二. 文件数据的导入导出
通过二维数组创建
import numpy as np
import pandas as pd
# 1、DataFrame的创建方式
# 1.1 通过二维数组创建
arr = [['张伊曼', 100], ['张诗诗', 90], ['张巧玲', 80]]
df0 = pd.DataFrame(arr)
print("df0===========================")
print(df0)
通过字典创建
# 1.2 通过字典创建
dict0 = {
'android': [90, 80, 60],
'java': [99, 78, 89],
'python': [98, 82, 85],
'c': 80
}
df0 = pd.DataFrame(dict0)
print("df0===========================")
print(df0)
DataFrame的基本属性
# 2、基本属性
arr = [['张伊曼', 100], ['张诗诗', 90], ['张巧玲', 80]]
df0 = pd.DataFrame(arr)
print("df0===========================")
print(df0)
print("df0.index===========================") #如果不指定index的值,就会从默认0开始
print(df0.index)
print("df0.columns===========================") #如果不指定columns的值,就会从默认0开始
print(df0.columns)
print("df0.dtypes===========================") #以列为单位算起
print(df0.dtypes)
print("df0.values===========================")
print(df0.values)
print("更换index、columns的值===========================")
df0 = pd.DataFrame(arr,index=['第一行','第二行','第三行'],columns=['name','分散'])
#df0.index = ['第一行', '第二行', '第三行'] #等同于以这种方式更改index的值
print(df0)
DataFrame的值的获取
介绍几个注意点:
1)索引对象,不管是Series还是DataFrame对象,都有索引对象,他们的自动对齐功能也是通过索引实现的
2)DataFrame可以直接通过列索引获取指定列的数据
3)如果需要获取指定行的数据的话,需要通过ix方法来获取对应行索引的行数据
4)DataFrame可以切片操作
# 3、DataFrame的值的获取
dict0 = {
'android': [90, 80, 60],
'java': [99, 78, 89],
'python': [98, 82, 85],
'c': 80
}
df0 = pd.DataFrame(dict0)
df0.index = ['张伊曼', '张诗诗', '张巧玲']
print("df0===========================")
print(df0)
# print(df0['张伊曼']['android']) #注意:先行后列获取会报错
print("单个的值的获取===========================")
print(df0['android']['张伊曼']) #通过这种方式获取单个的值
print("一行值的获取===========================")
print(df0.ix[0])
print("多行值的获取===========================")
print(df0.ix[:2])
print("任意多行值的获取===========================")
print(df0.ix[:2, :2])
print("一列值的获取===========================")
print(df0['android'])
修改值 新增列 新增行
注意:
1)numpy是不能加新行新列的 但是DataFrame可以
2)修改某个具体对象的值,即可以先列后行 也可以先行后列 最好是先列后行可以自动改变对象的数据类型
# 4、 修改值 新增列 新增行
dict0 = {
'android': [90, 80, 60],
'java': [99, 78, 89],
'python': [98, 82, 85],
'c': 80
}
df0 = pd.DataFrame(dict0)
df0.index = ['张伊曼', '张诗诗', '张巧玲']
print("df0===========================")
print(df0)
print("修改单个值===========================")
df0['android']['张伊曼'] = 100
print(df0)
print("修改一列值===========================")
df0['android'] = [100, 100, 100]
print(df0)
print("新增列===========================")
df0['c++'] = np.nan
print(df0)
print("新增行===========================")
df0.ix['思思'] = np.nan
print(df0)
三. 常用的数据处理
DataFrame的遍历
- 初始化
import pandas as pd
inp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}]
df = pd.DataFrame(inp)
print df
- for row in df: 获取每个列名
- 通过遍历
df
的行for date, row in df.T.iteritems():
或者for row in df.iterrows():
- 以迭代的方式遍历
for row in df.itertuples(index=True, name='Pandas')
DataFrame的数据运算
- 实例, 暂时不详细讲解
import numpy
from pandas import DataFrame
df = DataFrame({
"key1":['a','a','b','b','a'],
"key2":['one','tow','one','two','one'],
"data1":numpy.random.randn(5),
"data2":numpy.random.randn(5)
})
df.groupby("key1")["data1","data2"].agg(lambda arr : arr.max()-arr.min())
清除重复值
from pandas import read_excel
df = read_excel("d:/1.xlsx", sheetname="sheet1")
newDf = df.drop_duplicates()
缺失值处理
from pandas import dropna,read_excel
df = read_excel("d:/1.xlsx", sheetname="sheet1")
newDf = df.dropna()
空格值处理
from pandas import read_excel
df = read_excel("d:/1.xlsx", sheetname="sheet1")
newDf = df['name'].str.strip()
df['name'] = newDf
字段抽取
from pandas import read_excel
df = read_excel("d:/1.xlsx", sheetname="sheet1")
df['tel'] = df['tel'].astype(str)
bands = df['tel'].str.slice(0, 3)
areas = df['tel'].str.slice(3, 7)
nums = df['tel'].str.slice(7, 11)
字段分割
- split(sep, n, expand=False)
- sep 用于分割的字符串
- n 分割为多少列
- expand 是否展开为数据框,
- true 返回DataFrame
- false 返回Series
from pandas import read_excel
df = read_excel("d:/1.xlsx", sheetname="sheet1")
newDf = df['name'].str.split(' ', 1, True)
newDf.columns = ['band', 'name']
记录抽取
- dataframe[condition]
- condition 过滤的条件
- 比较运算
- df[df.comments>1000]
- 范围运算
- df[df.comments.between(100, 1000)]
- 空置匹配
- df[pandas.isnull(df.titile)]
- 字符匹配
- df[df.title.str.contains('sdfs', na=False)]
- 逻辑运算
- df[(df.comments>=100) & (df.comments<= 1000)]
- 比较运算
- 返回DataFrame
- condition 过滤的条件
随机抽样
- numpy.random.randint(start, end, num)
- 返回行数的索引值序列
from pandas import read_excel
df = read_excel("d:/1.xlsx", sheetname="sheet1")
r = numpy.random.randint(0, 10, 3)
df.loc[r, :]
记录合并
- concat([dataFrame1, dataFrame2,...])
- 返回DataFrame
from pandas import read_excel
df = read_excel("d:/1.xlsx", sheetname="sheet1")
df2 = read_excel("d:/2.xlsx", sheetname="sheet1")
concat([df, df2])
字段合并
- X = x1 + x2 必须是字符, 数量相
from pandas import read_excel
df = read_excel("d:/1.xlsx", sheetname="sheet1")
df = df.astype(str)
tel = df['band'] + df['area'] + df['num']
字段匹配
- merge(x, y, left_on, right_on)
- x 第一个数据框
- y 第二个数据框
- left_on 第一个数据框用于匹配的列
- right_on 第二个数据框用于匹配的列
- 返回DataFrame
from pandas import read_excel
df = read_excel("d:/1.xlsx", sheetname="sheet1")
df1 = read_excel("d:/1.xlsx", sheetname="sheet1")
ttimeprices = pandas.merge(
df,
df1,
left_on = "id",
right_on="id"
)
数据标准化
- 将数据按比例缩放, 使之落入特定区间, 一般我们使用0-1标准化;
- x* = x-min / max-min
from pandas import read_excel
df = read_excel("d:/1.xlsx", sheetname="sheet1")
scale = (df.score-df.score.min()) / (df.score.max()-df.score.min())
数据分组
- cut(series, bins, right=True, labels=NULL)
- series 需要分组的数据
- bins 分组的划分数组
- right 分组的时候右边是否闭合
- labels 分组的自定义标签, 也可以不定义
from pandas import read_excel
df = read_excel("d:/1.xlsx", sheetname="sheet1")
bins = [min(df.cost)-1, 20, 40, max(df.cost)+1]
labels = ['A', 'B', 'C']
pandas.cut(df.cost, bins)
pandas.cut(df.cost, bins, right=False)
pandas.cut(df.cost, bins, right=False, labels=labels)
日期转换
- date = to_datetime(dateString, format)
- 逆向有 datetime.strftime(x, format)
- %Y 代表年份
- %m 代表月份
- %d 代表日期
- %H 代表小时
- %M 代表分钟
- %S 代表秒
from pandas import read_excel
df = read_excel("d:/1.xlsx", sheetname="sheet1")
df_dt = pandas.to_datetime(df.注册时间, format="%Y/%m/%d")
日期抽取
- datetime列.dt.property
- second 1-60秒
- minute 1-60分钟
- hour 1-24小时
- day 1-31 一个月中的第几天
- month 1-12月份
- year 年份
- weekday 1-7一周中的第几天
from pandas import read_excel
df = read_excel("d:/1.xlsx", sheetname="sheet1")
df_dt = pandas.to_datetime(df.注册时间, format="%Y/%m/%d")
df_dt.dt.second
四. 向量化运算
from pandas import DataFrame
import numpy
r = numpy.arange(0.1, 0.5, 0.01)
r+r
r-r
r*r
r/r
# 长短不一时
r+1
# 函数式的向量化计算
numpy.power(r, 5)
# 比较计算
r > 0.3
# 矩阵计算
numpy.dot(r, r.T)
sum(r*r)
df = DataFrame({
"data1": numpy.random.randn(5),
"data2": numpy.random.randn(5)
})
df.apply(lambda x: min(x))
df.apply(lambda x: min(x), axis=1)
# 判断每个列是否都大于0
df.apply(lambda x: numpy.all(x>0), axis=1)
# 结合过滤
df[df.apply(lambda x: numpy.all(x>0), axis=1)]
五. 使用matplotlib作图
散点图 scatter diagram
- plot(x, y, ".", color=(r, g, b))
- x,y X.Y轴序列
- ".","o" 小点还是大点
- color 散点图的颜色, 可以用rgb定义, 也可以用英文字母
- plt.xlabel("x轴标签")
- plt.ylabel("y轴标签")
- plt.grid(True)
from pandas import read_excel
import matplotlib
import matplotlib.pyplot as plt
df = read_excel("d:/1.xlsx", sheetname="sheet1")
font = {
"family":"SimHei"
}
matplotlib.rc("font", **font)
plt.plot(data['广告费用'], data['购买用户数'], '.')
plt.xlabel('广告费用')
plt.ylabel('购买用户数')
plt.grid(True)
plt.show()
折线图
- plot(x, y, style, color, linewidth)
- style 画线的样式
- 连续的曲线
- -- 连续的虚线
- -. 连续的带点的曲线
- : 由点连成的曲线
- . 小点,散点图
- o 大点,散点图
- , 像素点(更小的点)的散点图
- 五角星的点,散点图
- color 线的颜色
- linewidth 线的宽度
- style 画线的样式
- title('图的标题')
import pandas
from pandas import read_csv
from matplotlib import pyplot as plt
data = read_csv("1.csv")
data['date'] = pandas.to_datetime(data['date'])
plt.plot(data['date'], data['购买人数'], '-', color='r', lineWidth=10)
饼图
- pie(x, labels, colors, explode, autopct)
- x 绘图的序列
- labels 绘图的各部分标签
- colors 各部分颜色
- explode 需要突出的块状序列
- autopct 饼图占比的显示格式, %.2f:保留2位小数
- title('图的标题')
import pandas,numpy
from pandas import read_csv
from matplotlib import pyplot as plt
data = read_csv("1.csv")
gb = data.groupby(
by=['通信品牌'],
as_index=False
)['号码'].agg({
'用户数':numpy.size
})
font = {
"family":"SimHei"
}
matplotlib.rc("font", **font)
plt.pie(gb['用户数'], labels=gb['通信品牌'], autopct='%.2f%%')
plt.show()
柱状图
- bar(left, height, width, color)
- left x轴的位置序列, 一般采用arange函数产生一个序列
- height y轴的数值序列, 也就是柱形图的高度, 一般我们展示的数据
- width 柱形图的宽度, 一般设置为1
- color 柱形图的颜色
- barh(bottom, width, height, color)
import pandas,numpy
from pandas import read_csv
from matplotlib import pyplot as plt
data = read_csv("1.csv")
gb = data.groupby(
by=['通信品牌']
)['月消费(元)'].agg({
'月消费':numpy.sum
})
font = {
"family":"SimHei"
}
matplotlib.rc("font", **font)
#竖向柱状图
plt.bar(index, gb['月消费'], 1, color='G')
# 标签添加
plt.xticks(index + 1/2, gb.index)
plt.show()
#横向柱状图
plt.bar(index, gb['月消费'], 1, color='G')
plt.xticks(index + 1/2, gb.index)
plt.show()
# 分组的条形图
d1 = '手机品牌'
d2 = '通信品牌'
v = '月消费'
gb = data.groupby(by=[d1, d2])['月消费(元)'].agg({v: numpy.sum})
d1size = gb.index.levels[0].size
d2size = gb.index.levels[1].size
index = numpy.arange(d1size)
colors = ['r', 'g', 'b']
for i in range(0, d2size):
print(i)
subgb = gb[v][gb.index.labels[1] == i]
bar = plt.bar(index*d2size + i, subgb, color=colors[i])
lIndex = numpy.arange(d1size) * d2size
plt.xticks(lIndex + 3/2, gb.index.levels[0])
plt.legend(gb.index.levels[1])
plt.show()
直方图
- hist(x, color, bins, cumulative=False)
- x 需要进行绘制的向量
- color 直方图的填充颜色
- bins 设置直方图的分组个数
- cumulative 设置是否累计计数, 默认False
import pandas,numpy
from pandas import read_csv
from matplotlib import pyplot as plt
data = read_csv("1.csv")
plt.hist(data['购买用户数'], bins=20, cumulative=True)
六. 数据统计
散点图 scatter diagram
- plot(x, y, ".", color=(r, g, b))
- x,y X.Y轴序列
- ".","o" 小点还是大点
- color 散点图的颜色, 可以用rgb定义, 也可以用英文字母
- plt.xlabel("x轴标签")
- plt.ylabel("y轴标签")
- plt.grid(True)
from pandas import read_excel
import matplotlib
import matplotlib.pyplot as plt
df = read_excel("d:/1.xlsx", sheetname="sheet1")
font = {
"family":"SimHei"
}
matplotlib.rc("font", **font)
plt.plot(data['广告费用'], data['购买用户数'], '.')
plt.xlabel('广告费用')
plt.ylabel('购买用户数')
plt.grid(True)
plt.show()
折线图
- plot(x, y, style, color, linewidth)
- style 画线的样式
- 连续的曲线
- -- 连续的虚线
- -. 连续的带点的曲线
- : 由点连成的曲线
- . 小点,散点图
- o 大点,散点图
- , 像素点(更小的点)的散点图
- 五角星的点,散点图
- color 线的颜色
- linewidth 线的宽度
- style 画线的样式
- title('图的标题')
import pandas
from pandas import read_csv
from matplotlib import pyplot as plt
data = read_csv("1.csv")
data['date'] = pandas.to_datetime(data['date'])
plt.plot(data['date'], data['购买人数'], '-', color='r', lineWidth=10)
饼图
- pie(x, labels, colors, explode, autopct)
- x 绘图的序列
- labels 绘图的各部分标签
- colors 各部分颜色
- explode 需要突出的块状序列
- autopct 饼图占比的显示格式, %.2f:保留2位小数
- title('图的标题')
import pandas,numpy
from pandas import read_csv
from matplotlib import pyplot as plt
data = read_csv("1.csv")
gb = data.groupby(
by=['通信品牌'],
as_index=False
)['号码'].agg({
'用户数':numpy.size
})
font = {
"family":"SimHei"
}
matplotlib.rc("font", **font)
plt.pie(gb['用户数'], labels=gb['通信品牌'], autopct='%.2f%%')
plt.show()
柱状图
- bar(left, height, width, color)
- left x轴的位置序列, 一般采用arange函数产生一个序列
- height y轴的数值序列, 也就是柱形图的高度, 一般我们展示的数据
- width 柱形图的宽度, 一般设置为1
- color 柱形图的颜色
- barh(bottom, width, height, color)
import pandas,numpy
from pandas import read_csv
from matplotlib import pyplot as plt
data = read_csv("1.csv")
gb = data.groupby(
by=['通信品牌']
)['月消费(元)'].agg({
'月消费':numpy.sum
})
font = {
"family":"SimHei"
}
matplotlib.rc("font", **font)
#竖向柱状图
plt.bar(index, gb['月消费'], 1, color='G')
# 标签添加
plt.xticks(index + 1/2, gb.index)
plt.show()
#横向柱状图
plt.bar(index, gb['月消费'], 1, color='G')
plt.xticks(index + 1/2, gb.index)
plt.show()
# 分组的条形图
d1 = '手机品牌'
d2 = '通信品牌'
v = '月消费'
gb = data.groupby(by=[d1, d2])['月消费(元)'].agg({v: numpy.sum})
d1size = gb.index.levels[0].size
d2size = gb.index.levels[1].size
index = numpy.arange(d1size)
colors = ['r', 'g', 'b']
for i in range(0, d2size):
print(i)
subgb = gb[v][gb.index.labels[1] == i]
bar = plt.bar(index*d2size + i, subgb, color=colors[i])
lIndex = numpy.arange(d1size) * d2size
plt.xticks(lIndex + 3/2, gb.index.levels[0])
plt.legend(gb.index.levels[1])
plt.show()
直方图
- hist(x, color, bins, cumulative=False)
- x 需要进行绘制的向量
- color 直方图的填充颜色
- bins 设置直方图的分组个数
- cumulative 设置是否累计计数, 默认False
import pandas,numpy
from pandas import read_csv
from matplotlib import pyplot as plt
data = read_csv("1.csv")
plt.hist(data['购买用户数'], bins=20, cumulative=True)