Pandas常用小结

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容