总结下自己常用的内容,想要系统了解学习的,强烈建议阅读官方文档,时间有限的话,阅读官方Get started和Tutorial是最高效的。
apply和字典可以随便搞搞,好用的很,基本可以解决90%以上的问题,如果有某些场景解决不了,欢迎讨论,一起进步!
一、基本操作
基本数据结构包括Series、DataFrame,DataFrame常用的三要素:index、columns、values。
df=pd.DataFrame(np.random.rand(12).reshape(3,4)*100,
index=['one','two','three'],columns=['a','b','c','d'])
df = pd.DataFrame({'value1':np.random.randn(10)*10, 'value2':np.random.randn(10)*100})df.dtypes
df.info()
df.sample(7) # 我喜欢这么看数,哈哈
二、数据切片
pd提供了比较自由的方式,可根据需要选择自己习惯的,这里想强调的是,在数据量大的情况下,效率差异很大,按照优先顺序建议使用。
# pandas数组操作
def method6_times(DF):
DF['eee'] = DF['aaa'] * DF['bbb'] # 索引会自动对齐,很好的特性。# pandas.DataFrame.apply 迭代 + 只讀兩列
def method4_times(DF):
DF['eee'] = DF[['aaa','bbb']].apply(lambda x: x.aaa * x.bbb, axis=1)
# python 循環 + iat 定位
def method1_times(DF):
for i in range(len(DF)):
DF.iat[i,4] = DF.iat[i,0] * DF.iat[i,1]
# 列表構造
def method5_times(DF):
DF['eee'] = [ a*b for a,b in zip(DF['aaa'],DF['bbb']) ]
优先使用numpy数组操作!不能数组操作的时候用列表构造!
能用at/iat就不用loc/iloc,能用apply就不用迭代,能用数组操作就不用其他方法。
不过我自己比较喜欢用loc、iloc,尴尬……
# 列索引
data2 = df.loc[['one','two']]# 行索引
data4 = df.iloc[[0,2]]
只是查看数据而非数据操作的话,ix最灵活,代码如下:
df.ix[[0,2,4,5,7],['Name','Height','Weight']]
三、数据预处理
不含分组,groupby的用法上手很简单,但其实非常复杂,值得单独讲讲,pivot_table一起。
df1['comment'] = df1['comment'].str.split('条').str[0]
df1 = df1[df1['price'].str.contains('¥')]
df1['price'] = df1['price'].astype('float')# 去重
df = pd.DataFrame({'key1':['a','a',3,4,5], 'key2':['a','a','b','b','c']})
print(df.duplicated()) # 行级bool结果值
s_re = s.drop_duplicates()
# print(s[s.duplicated() == False]) # 这二者的结果是不一样的哦。# 替换
print(s.replace(['a','s'] ,np.nan)) # 该用法还蛮方便的
print(s.replace({'a':'hello world!','s':123})) # 字典是真好用啊。# 合并
print(pd.merge(df3, df4,on=['key1','key2'], how = 'inner')) # concat也老用。
最值得强调的一点,行列转换,实际数据处理中绝对是高频需要。
pandas行转列,使用unstack,默认是将一级索引变成DataFrame的索引,二级索引变成DataFrame的列,也可以使用pivot,简单直接。
pandas列转行,同样可以使用stack、unstack,pd.melt亦可。
四、时间数据处理
首先要介绍一下datetime模块(是time模块的高级封装,提供更多常用函数;亦可以用dateutil,更高级的封装),了解了基本的数据类型就知道怎么使用了。
date = ['2017-6-26','2017-6-27']
# 将时间解析为字符串
datetime2 = [datetime.strptime(x,'%Y-%m-%d') for x in date]pd.to_datetime(date) # pd将字符串转换为时间类型
转换成时间类型有啥好处呢,可以进行切片呐!
ts = ts.set_index('date')
ts['2017-06'] # 看某个月份的数据
ts['2017-06-20':'2017-06-23'] # 时间范围进行切片
ts['2016':'2017'] # 年度时间范围的切片
ts.truncate(after = '2013-11') # 某个时间之后的数据,同理before是获取之前的数据。ts_period = ts.to_period('M') # 按月显示,但不统计,Q 季度、A年度。
ts_period.index.asfreq('A') # 'A'默认是'A-DEC',其他如'A-JAN' ,你想要哪个月就哪个月。
ts_period.index.asfreq('B', how='start') # 按工作日期显示 。ts.resample('w').sum() # 按日期统计数据。M月度、Q季度、AS年初A年末。
ts.resample('Q').sum().to_period('Q') # 举例,按季度统计后按季度显示。
友情提醒,为了提高性能,应避免在读入数据后再进行pd.to_datetime的操作,而应在读取数据时指定时间列:parse_dates。
五、常用函数
df = df.cumsum() # 累积求和,excel里好像没有直接的公式。
df.idxmin() # 最小值的索引位置。
df.quantile(0.1) # 十分位数
df.describe().T # 我习惯转置了看,类别型的话加个参数:include='O'
df.corr() # 相关系数
df.corrwith(df['x1']) # 某个变量与其他变量的相关系数
df.sort_index() # 按照行标签或列标签的名字进行排序,默认行标签axis=0
df.sort_values(by=['a', 'b'], ascending=[True, False])
# 根据行或列的值进行排序,na_position='last' 将空值排在最后
# 默认axis=0,纵向排序,也就是按行排序。df['a'].isnull().all() # 是否至少有一个True
df['a'].isnull().any() # 是否全部为True
六、数据可视化
其实之前有写过一篇使用seaborn、matplotlib进行可视化的,pandas总结的时候发现,直接pd绘图更方便呐!
但散点图的话,仍然觉得seaborn的pairplot更好用。
df = pd.DataFrame(np.random.randn(300, 4),columns=list('ABCD'))
df = df.cumsum()
df.plot(style = '--.', alpha = 0.8, colormap = 'GnBu', figsize=(12,6), grid=True)
plt.figure(num=1) # 图像唯一编号参数,暂时觉得没啥用。
df.plot.hist(stacked=True, bins=20, colormap='Greens_r', alpha=0.5, grid=True, figsize = (12,6))
# 生成多个直方图
df.hist(bins=50,figsize=(12,6))
# 散点图
plt.figure(figsize=(8,6))
x = np.random.randn(1000)
y = np.random.randn(1000)
plt.figure(figsize = (12,6))
plt.scatter(x,y, marker='.',linewidth=0.8,edgecolor='k',
s = np.random.randn(1000)*100, cmap = 'Reds', c = y, alpha = 0.8)
plt.grid()
附,参考资料:
1、利用Python进行数据分析,https://book.douban.com/subject/25779298/
2、Python Pandas 遍历DataFrame的正确姿势 速度提升一万倍,https://zhuanlan.zhihu.com/p/97269320?utm_source=wechat_session
3、高效分析:如何用pandas快速处理数据,https://www.kesci.com/mw/project/5cd2b2b2e2889b002bbd6e8b
4、python+pandas+时间、日期以及时间序列处理,https://blog.csdn.net/ly_ysys629/article/details/73822716
5、Pandas日期数据处理:如何按日期筛选、显示及统计数据,https://www.cnblogs.com/lemonbit/p/6896499.html
6、pandas行转列、列转行、以及一行生成多行,https://www.cnblogs.com/traditional/p/11967360.html