Python碎碎念(4):10 Minutes to Pandas

转载请在文章起始处注明出处,谢谢。


jupyter notebook 保存的md文件用markdownpad打开后,无法直接复制黏贴到简书,因为运行结果会乱码。用火狐插件打开却是正常的。有知道怎么将jupyternotebook保存的md文件直接发布到简书的大佬可以私信我,感谢~

PS.尝试过发布到知乎,上传文档失败。下面的图都是一张一张截的。。


官方文档:十分钟入门pandas

参考王大伟博客

导入模块

#coding: utf-8
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

创建对象

s = pd.Series([1,3,4,np.nan,4,5]) #np.nan标识不存在
s
#使用datetime作为索引和标记列名
dates = pd.date_range('2019-01-01',periods = 6)
dates
#查看说明
?pd.date_range
df = pd.DataFrame(np.random.randn(6,4),index = dates,columns=list('ABCD'))
df
?np.random.randn
#查看dataframe类型信息
df.dtypes
#使用字典创建dataframe
df2 = pd.DataFrame({ 'A' : 1.,
                     'B' : pd.Timestamp('20130102'),
                     'C' : pd.Series(1,index=list(range(4)),dtype='float32'),
                     'D' : np.array([3] * 4,dtype='int32'),
                     'E' : pd.Categorical(["test","train","test","train"]),
                     'F' : 'foo' },index=list('ABCD'))
df2
#更改索引
df2.index = list('1234')
df2
#查看dataframe类型信息
df2.dtypes

查看数据

#查看前三行(默认五行)
df.head(3)
#查看后两行(默认五行)
df2.tail(2)
#显示索引
df.index
#显示列名
df.columns
#查看底层numpy数据
df.values
#对数据的描述性统计信息
df.describe()
#转置
df.T
#按轴排序
#axis = 0 跨行    axis = 1 跨列
df.sort_index(axis=1, ascending=False) 
df.sort_index(axis=0, ascending=False)
df.sort_index(0,ascending=False)
#按值排序
df.sort_values(by='B')

选择数据

#选择一个列,返回一个Series
df.A #取A列数据,返回的是一个序列
df['A']
df[['A','B']]
#切片
df[0:3] #使用默认索引取出前三行
df2[:2]
df['2019-01-01':'2019-01-05']
df[0:3]['A'] 
df['B'][0:3]

标签选择

df.loc[dates[0]] #取出第一行
#通过标签选择多列
df.loc['20190101':'20190103',['A','B']]
df.loc[:,['A','B']]
df[['A','B']]
#减少返回对象的维度
df.loc['2019-01-06',['A','B']]
df.loc[df.index[0],['A','B']]
for i in df.index:
    print(i) #索引可迭代
#获得标量值(就是定位一个具体的值)
df.loc[dates[0],'A']
#快速访问标量(等同于先前的方法)
df.at[dates[0],'A']

按位置选择

df
df.iloc[1]
#通过整数切片
df.iloc[0:1,0:2]
#切出3-4行,1-2列一块区域,通过整数位置列表切分
df.iloc[[0,2,4],[0,2]]
#切出分行
df.iloc[:3,:]
#切出分列
df.iloc[:,1:3]
#获取某个值
df.iloc[0,0]
#快速访问某个值
df.iat[0,0]

布尔索引

#使用单列值选择数据
df[df.A > 0] #先判断A栏中大于零的数,然后把这些行取出来
#从满足布尔条件的DataFrame中选择值
df[df > 0]
df > 0
#使用isin()方法进行过滤
df3 = df.copy()
df3
df3['E'] = ['one','two','three','four','five','six']
df3
df3.isin(['two'])
df3[df3['E'].isin(['two'])] #相当于判断two是否在df3的E列中,在的话返回True,然后将参数传入df3,返回这列的值

设置

s1 = pd.Series([1,2,3,4,5],index=pd.date_range('20190103',periods=5,freq='D'))
s1
df['F'] = s1
df
df['E'] = ['one','two','three','four','five','six'] #必须和行数一致
df
np.array([5]*len(df3))
df.D = np.array([5]*len(df3))
df
#产生一个数组,每个元素值为5,长度为df的行数,替换在原来df的D列
df.iloc[:,0] = np.array([5]*len(df3))
df
df.loc[:,'B'] = np.array([9]*len(df3))
df
#按位置设定值
df.iat[0,0] = 999
df
#设置操作
df4 = -df['B']
df4

缺失值处理

df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
df
list(df.columns)
df.columns
#pandas主要使用值np.nan来表示丢失的数据,默认情况下不包括在计算中
#重新索引允许更改/添加/删除指定轴上的索引,这将返回数据的副本
df1 = df.reindex(index=dates[0:4],columns=list(df.columns)+['E'])
df1['E'].iloc[0:3] = 1
df1
?df1.dropna
df1.dropna(0,how='any')
?df1.drop
df1.drop(['A','B'],1)
df1.drop(dates[0],0)
#填充缺失值
df1.fillna(value=5)
#查看空值数据,返回True的是空值数据
pd.isnull(df1)
df1.isnull()

统计

df1.describe()
df1.describe().at['count','E']
#求每列平均值
df.mean()
#每行求平均值
df.mean(1)

Apply

df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
df
?np.cumsum
df.apply(np.cumsum) #行累加,就是第二行的结果等于第一行加第二行数据,依次累加

直方图化

s = pd.Series(np.random.randint(0,7,10))
s
#对数据进行计数
s.value_counts()
s.value_counts(sort=False,ascending=True)

字符串方法

s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat']) 
s.str.lower()
s
![](https://upload-images.jianshu.io/upload_images/2312794-fa9462bc006160d2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

字符连接

#产生一个10行4列的标准正态分布
df = pd.DataFrame(np.random.randn(10,4))
df
#切成三块
pieces = [df[0:3],df[3:7],df[7:]]
pieces
pd.concat(pieces)

join加入操作

#SQL风格合并
left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})
left
right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})
right
pd.merge(left,right,on='key') #连接之后的效果如下,有点像笛卡尔积操作
left.merge(right,on='key')

Append

df = pd.DataFrame(np.random.randn(8,4),columns=list('ABCD'))
df
#将第三行复制一份添加到了最后一行(增加了一行)
s = df.iloc[3]
df.append(s,ignore_index=True)
df.append(s)

分组

通过“group by”,我们指的是涉及一个或多个以下步骤的过程:
1.根据一些标准将数据分成组
2.将功能独立应用于每个组
3.将结果合并成数据结构
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
                          'foo', 'bar', 'foo', 'foo'],
                   'B' : ['one', 'one', 'two', 'three',
                          'two', 'two', 'one', 'three'],
                   'C' : np.random.randn(8),
                   'D' : np.random.randn(8)})
df
df.groupby(['A','B']).mean()

Stack堆(略)

#创建了一个list,并且用zip方法整合合并成内部是tuple形式
tuples = list(zip(*[['bar', 'bar', 'baz', 'baz',
                     'foo', 'foo', 'qux', 'qux'],
                    ['one', 'two', 'one', 'two',
                    'one', 'two', 'one', 'two']]))
tuples
#将数据转为MultiIndex结构,即从字面上理解为多索引结构
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
index
df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=['A', 'B'])
df
df2 = df[:4]
df2
#stack()方法“压缩”DataFrame的列
#使用“堆叠”DataFrame或Series(具有MultiIndex作为索引),stack()的反向操作是unpack(),它默认情况下解除最后一个级别
stacked = df2.stack()
stacked
#unstack会默认多层索引的series转变为DataFrame
stacked.unstack()
stacked.unstack(1)
stacked.unstack(0)

数据透视表(略)

import datetime
df = pd.DataFrame({'A': ['one', 'one', 'two', 'three'] * 6,
                   'B': ['A', 'B', 'C'] * 8,
                   'C': ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 4,
                   'D': np.random.randn(24),
                   'E': np.random.randn(24),
                   'F': [datetime.datetime(2013, i, 1) for i in range(1, 13)] +
                        [datetime.datetime(2013, i, 15) for i in range(1, 13)]})
df
pd.pivot_table(df,values='D',index=['A','B'],columns='C')

时间序列(略)

#pandas具有简单,强大和高效的功能,用于在频率转换期间执行重采样操作(例如,将数据转换为5分钟数据)。这在金融应用中非常常见,但不限于此。
rng = pd.date_range('1/1/2012', periods=100, freq='S')
rng
ts = pd.Series(np.random.randint(0,500,len(rng)),index=rng)
ts
ts.resample('50s').sum()
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts = ts.cumsum()
ts.cumsum().plot()
plt.show()

获取数据输入/输出

pd.read_csv('foo.csv')
df.to_csv('foo.csv')
pd.read_excel('foo.xlsx', 'Sheet1', index_col=None, na_values=['NA'])
df.to_excel('foo.xlsx', sheet_name='Sheet1')
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,501评论 6 544
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,673评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,610评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,939评论 1 318
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,668评论 6 412
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 56,004评论 1 329
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 44,001评论 3 449
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,173评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,705评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,426评论 3 359
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,656评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,139评论 5 364
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,833评论 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,247评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,580评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,371评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,621评论 2 380

推荐阅读更多精彩内容