Python之pandas进阶(一)
一、构建dataframe
我们可以像前面那样从csv构建dataframe,也可以从dict中创建dataframe。
- 使用zip()函数
- 添加新列
- 广播(Broadcasting): 创建新列并为整个列赋值
# 从字典中构建dataframe
country=['Spain','France']
population=['11','12']
list_label=['country','population']
list_col=[country,population]
print(list_col)
运行结果
# zip()函数
zipped=list(zip(list_label,list_col))#转为list
data_dict=dict(zipped)#转为dict
df=pd.DataFrame(data_dict)#转为dataframe
print(df)
运行结果
#添加新列
df['capital']=['madrid','paris']
print(df)
运行结果
#广播
df['income']=0#广播整列
print(df)
二、可视化EDA
1.绘图
import pandas as pd
import matplotlib.pyplot as plt
data=pd.read_csv('..\data\pokemon\Pokemon.csv')
# print(data)
data1=data.loc[:,['Attack','Defense','Speed']]
# print(data1)
data1.plot()
plt.show()
三条曲线在一张图中看起来很乱,分别绘制子图
data1.plot(subplots=True)
plt.show()
# 绘制散点图
data1.plot(kind='scatter',x='Attack',y='Defense')
plt.show()
# 绘制直方图
data1.plot(kind='hist',y='Defense',bins=30,range=(0,250))
plt.show()
fig,axes=plt.subplots(nrows=2,ncols=1)
# 统计直方图
data1.plot(kind='hist',y='Defense',bins=50,range=(0,250),ax=axes[0])
#累计直方图
data1.plot(kind='hist',y='Defense',bins=50,range=(0,250),ax=axes[1],cumulative=True)
plt.show()
2.describe()函数
- count: 计算每个条目出现的次数
- mean: 平均值
- std: 标准差
- min: 最小值
- 25%: 第一四分位数
- 50%: 中位数
- 75%: 第三四分位数
- max: 最大值
print(data1.describe())
运行结果
三、时间序列处理
import pandas as pd
time_list=['1992-03-08','1992-04-12']
print(type(time_list[1]))#此时日期是str类型
#我们希望能把它变为datatime类型
datatime_object=pd.to_datetime(time_list)
print(type(datatime_object))#datatime 类型
运行结果
import warnings
import pandas as pd
data=pd.read_csv('..\data\pokemon\Pokemon.csv')
# 调用filterwarning()关闭警告
warnings.filterwarnings('ignore')
data2=data.head()
date_list=['1992-01-10','1992-02-10','1992-03-10','1993-03-15','1993-03-16']
# 转换为datatime类型
datetime_object=pd.to_datetime(date_list)
data2['date']=datetime_object
# 设置日期作为索引
data2=data2.set_index('date')
print(data2)
运行结果
# 根据日期索引筛选数据
print(data2.loc['1993-03-16'])
print(data2.loc['1992-03-10':'1993-03-16'])
运行结果
四、时间序列重采样
Pandas提供了便捷的方式对时间序列进行重采样(resampling),根据时间粒度的变大或者变小分为降采样和升采样:
降采样(Downsampling): 时间粒度变大。例如,原来是按天统计的数据,现在变成按周统计。
升采样(Upsampling): 时间粒度变小。例如,原来是按周统计的数据,现在变成按天统计。
插值(Interpolate): 根据“linear”、“time”或“index”等不同方法插值。
# 按年重采样
print('###按年重采样')
print(data2.resample('Y').mean())
# 按月重采样
print('###按月重采样')
print(data2.resample('M').mean())
运行结果
按月重采样存在许多NAN,因为data2中不包括所以的月份
#真实数据场景中,可以使用interpolate()从初值开始插值
print(data2.resample('M').first().interpolate('linear'))
#可以使用mean()进行插值
print(data2.resample('M').mean().interpolate('linear'))
运行结果
自学自用,希望可以和大家积极沟通交流,小伙伴们加油鸭,如有错误还请指正,不喜勿喷