Pandas常用小结

2021-01-31  本文已影响0人  斑马上树

总结下自己常用的内容,想要系统了解学习的,强烈建议阅读官方文档,时间有限的话,阅读官方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

上一篇 下一篇

猜你喜欢

热点阅读