转载请在文章起始处注明出处,谢谢。
jupyter notebook 保存的md文件用markdownpad打开后,无法直接复制黏贴到简书,因为运行结果会乱码。用火狐插件打开却是正常的。有知道怎么将jupyternotebook保存的md文件直接发布到简书的大佬可以私信我,感谢~
PS.尝试过发布到知乎,上传文档失败。下面的图都是一张一张截的。。
导入模块
#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

字符连接
#产生一个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')