pandas 处理缺失值
1.判断空值
data = 读入数据
pd.notnull(data) # 返回TRUE or FALSE
pd.isnull(data) # 返回TRUE or FALSE
pd.all(pd.notnull(data)) # 返回TRUE or FALSE
data = pd.read_excel('./pythonProject/data_process/traffic_data_103.xlsx')
np.all(pd.notnull(data))
after_drop_data = data.dropna()
np.all(pd.notnull(after_drop_data))
mean_data = after_drop_data['车流量'].mean()
after_drop_data['车流量'].fillna(after_drop_data['车流量'].mean(), inplace = True)
# after_drop_data['车流量'].fillna(mean_data, inplace = True)
# 遍历表头查找有空值的列名
for i in data.columns:
if np.any(pd.isnull(data[i])) == True:
print(i)
data[i].fillna(data[i].mean(), inplace = True)
np.any(pd.isnull(data[i]))
替换
# 替换,查找出异常值后可替换为NAN,再进行空值处理
# data.replace(to_replace="?", value=np.nan)
数据离散化
连续属性离散化的目的是为了简化数据结构,数据离散化技术可以用来减少给定连续属性值的个数。离散化方法经常作为数据挖掘的工具。
连续属性的离散化就是在连续属性的值域上,将值域划分为若干个离散的区间,最后用不同的符号或整数 值代表落在每个子区间中的属性值。
离散化有很多种方法,这使用一种最简单的方式去操作。原始人的身高数据:165,174,160,180,159,163,192,184。假设按照身高分几个区间段:150165,165180,180~195这样我们将数据分到了三个区间段,我可以对应的标记为矮、中、高三个类别,最终要处理成一个"哑变量“矩阵
pd.qcut(data, q)
对数据进行分组将数据分组,一般会与value_counts搭配使用,统计每组的个数
series.value_counts():统计分组次数
合并
pd.concat([数据1, 数据2], axis='')
pd.merge(left, right, how = )
交叉表
计算一列数据对于另一列数据的分组个数
透视表
指定某一列对另一列的关系
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data = pd.read_csv('./stock_day.csv') # 图1
data.index # 图2
time = pd.to_datetime(data.index) # 图3
time.day # 图4
data['week'] = time.weekday # 图5
data['p_n'] = np.where(data['p_change'] > 0, 1, 0) # data['p_change']如果大于0置为1,否则为0 # 图6
count = pd.crosstab(data['week'], data['p_n']) # 图7
sum = count.sum(axis=1).astype(np.float32) # 图8
ret = count.div(sum, axis = 0) # 图9
ret.plot(kind='bar', stacked=True)
plt.show() # 图10
data.pivot_table(['p_n'],index='week') # 图11
图1
图2
图3
图4
图5
图6
图7
图7
图8
图9
图10
图11
分组和聚合
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data = pd.read_csv('./stock_day.csv')
data.head() # 图12
data.index # 图13
time = pd.to_datetime(data.index)
time # 图14
time.weekday # 图15
time.day # 图16
data['week'] = time.weekday
data.head() # 图17
data['p_n'] = np.where(data['p_change'] > 0, 1, 0) # data['p_change']如果大于0置为1,否则为0
data.head() # 图18
count = pd.crosstab(data['week'], data['p_n']) # 图19
sum = count.sum(axis=1).astype(np.float32) # 图20
ret = count.div(sum, axis = 0) # 图21
ret.plot(kind='bar', stacked=True)
plt.show() # 图22
data.pivot_table(['p_n'],index='week') # 图23
col = pd.DataFrame({'color':['white', 'red', 'green', 'red', 'green'], 'object': ['pen', 'pencil', 'pencil', 'ashtray', 'pen'], 'price1': [5.56, 4.20, 1.30, 0.56, 2.75], 'price2': [4.75, 4.12, 1.60, 0.75, 3.15]}) # 图24
col.groupby(['color'])['price1'].mean() # 图25
col['price1'].groupby(col['color']).mean() # 图26
col.groupby(['color'], as_index = False)['price1'].mean() # as_index = False 保留原来索引 0, 1, 2 ... # 图27
图12
图13
图14
图15
图16
图17
图18
图19
图20
图21
图22
图23
图24
图25
图26
图27
seaborn
pip3 install seaborn import seaborn as sns
可视化数据的分布
处理一组数据时,通常要做的就是了解变量是如何分布的。
对于单变量的数据来说,采用直方图或核密度曲线。
对于双变量来说,可采用多面板图形展现,比如:散点图、二维直方图、核密度估计图形等。
绘制单变量分布
可采取简单的直方图描述单变量的分布情况。Seaborn 提供了 distplot()函数,它默认绘制的是一个带有核密度估计曲线的直方图。
seaborn.distplot(a, bins=None, hist=True,kde=True,rug=False,fit=None,color=None)
a:表示要观察的数据。可以是Series一维数组或列表。
bins:用于控制条形的数量。
hist:接受布尔类型,表示是否绘制(标注直方图)。
kde:接受布尔类型,表示是否绘制高斯核密度估计曲线。
rug:接受布尔类型,表示是否在支持的轴方向上绘制rugplot
import seaborn as sns
import numpy as np
np.random.seed(0) # 确定随机数生成器生成的数据是一样的。如果没有每次随机生成的值不一样。
arr = np.random.randn(100) # 随机生成 100 个变量
sns.distplot(arr, bins=10, hist=True, kde=True, rug=True) # hist=True直方图,kde=True核密度估计曲线,rug=True绘制rugplot
绘制单变量分布
绘制双变量分布
df = pd.DataFrame({"x":np.random.randn(500), "y":np.random.randn(500)})
df.head() # 图28
sns.jointplot(x="x", y="y", data=df, kind="kde") # 图29 kind="kde" 是核密度估计图形
sns.jointplot(x="x", y="y", data=df, kind="scatter", color="r", ratio=5, space=1) # 图30
图28
图29
图30
绘制二维直方图
sns.jointplot(x="x", y="y", data=df, kind="hex")
绘制成对的双变量分布
dataset = sns.load_dataset("iris")
dataset.head() # 图31 # 图32 “iris”数据集参数介绍
sns.pairplot(dataset) # 图33
图31
图32 “iris”数据集参数介绍
图33
类别散点图
sns.stripplot(x='day', y='total_bill', data=data)
x, y, hue: 用于绘制长格式数据的输入
data: 用于绘制的数据集。如果 x 和 y 不存在,则它将作为宽格式,否则将作为长格式。
jitter:表示抖动的程度(仅沿类别轴)。当很多数据点重叠时,可以指定抖动的数量或者设为True使用默认值。
data=sns.load_dataset('tips')
data.head() # 图34
sns.stripplot(x='day', y='total_bill', data=data) # 图35
sns.stripplot(x='day', y='total_bill', data=data, hue="time") # 图36
sns.stripplot(x='day', y='total_bill', data=data, hue="time", jitter=True) # 图37
sns.swarmplot(x="day", y="total_bill",data=data) # 图38
图34
图35
图36
图37
图38