《莫烦Python》笔记 -- pandas部分
2018-12-28 本文已影响8人
小T数据站
3.1 pandas基本介绍
import pandas as pd
import numpy as np
s = pd.Series([1,3,6,np.nan,44,1])
dates = pd.date_range('20160101',periods=6)
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=['a','b','c','d'])
df1 = pd.DataFrame(np.arange(12).reshape((3,4)))
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'})
数据框df2
df2.dtypes # 查看数据框各列的数据类型
df2.info() # 补充:更为详尽的数据概览
df2.index # 查看数据框的索引
df2.columns # 查看数据框的列名
df2.values # 查看数据框的详细数据
df2.describe() # 对数据框内的数值列进行简单的描述统计
df2.T # 对数据框进行转置
df2.sort_index(axis=1,ascending=False) # 按照索引进行排序,axis=0是默认值,表示按照行索引进行排序,ascending=False表示降序排序
df2.sort_values(by='E') # 按照指定的某列值进行排序
图3.1-1
图3.1-2
图3.1-3
图3.1-4
3.2 pandas选择数据
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=['A', 'B', 'C', 'D'])
df['A'] # 选取数据框中列名为A的一列数据
df.A # 同样,选取数据框中列名为A的一列数据
df[0:3] # 选取第0列至第3列的数据
df['20130102':'20130104'] # 选取行索引值为20130102至20130104的数据
# select by label : loc 根据索引选取数据
df.loc['20130102']
df.loc[:,['A','B']]
df.loc['20130102',['A','B']]
# select by position : iloc 根据位置选择数据
df.iloc[3]
df.iloc[3,1]
df.iloc[3:5,1:3]
df.iloc[[1,3,5],1:3]
# mixed selection : ix 根据索引和位置选取数据,但ix疑被弃用
df.ix[:3,['A','B']]
# boolean indexing 根据布尔值筛选数据
df[df.A>1]
图3.2-1
图3.2-2
图3.2-3
图3.2-4
图3.2-5
图3.2-6
3.3 pandas设置值
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=['A', 'B', 'C', 'D'])
df.iloc[2,2] = 1111
df.loc['20130101','B'] = 2222
df[df.A>0]=1
df.A[df.A<0]=-1
df.B[df.A>0]=11
df['E'] = np.nan
df['F'] = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130101', periods=6))
图3.3-1
3.3-2
图3.3-3
图3.3-4
3.4 pandas处理缺失值
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6,4)), index=dates, columns=['A', 'B', 'C', 'D'])
# 模拟产生两个缺失值
df.iloc[0,1] = np.nan
df.iloc[1,2] = np.nan
df.dropna(axis=0, how='any')
# how='any'/'all',any表示行或列中存在缺失值就删除那一行或列,而all表示某行或某列全为缺失值才删除,any是默认值
df.fillna(value=0) # 使用value参数指定的值来填充缺失值
pd.isnull(df)
np.any(df.isnull()) == True # 用来查看数据框里是否存在缺失值
图3.4-1
图3.4-2
图3.4-3
3.5 pandas导入导出
- pd.read_csv()、pd.to_csv()
- pd.read_excel()、pd.to_excel()
以上两对读取函数可参照我之前的文章Excel文件以及csv文件的载入与存储 - pd.read_pickle()pd.to_pickle()这对函数我还没接触到相应的文件格式,故暂未深入了解,先占坑
3.6 pandas合并concat
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'])
df2 = pd.DataFrame(np.ones((3,4))*1, columns=['a','b','c','d'])
df3 = pd.DataFrame(np.ones((3,4))*2, columns=['a','b','c','d'])
res = pd.concat([df1, df2, df3], axis=0, ignore_index=True) # ignore_index = True 表示忽略原来的索引,重新生成索引
df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'], index=[1,2,3])
df2 = pd.DataFrame(np.ones((3,4))*1, columns=['b','c','d', 'e'], index=[2,3,4])
res = pd.concat([df1, df2], axis=1, join='outer') # pd.concat()里参数join的默认值为'outer'
res = pd.concat([df1, df2], axis=1, join='inner')
res = pd.concat([df1, df2], axis=1, join_axes=[df1.index]) # 根据参数join_axes指定的数据框的索引进行连接
df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'])
df2 = pd.DataFrame(np.ones((3,4))*1, columns=['a','b','c','d'])
res = df1.append(df2, ignore_index=True)
df3 = df2
res = df1.append([df2,df3], ignore_index=True)
s1 = pd.Series([1,2,3,4], index=['a','b','c','d'])
res = df1.append(s1, ignore_index=True) # 逐行连接
图3.6-1
图3.6-2
图3.6-3
图3.6-4
图3.6-5
图3.6-6
3.7 pandas合并merge
import pandas as pd
import numpy as np
# 通过键值连接两个数据框
left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
res = pd.merge(left, right, on='key')
# 考虑用两个键值连接数据框
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
res = pd.merge(left, right, on=['key1', 'key2'], how='inner') # merge里how的默认值为'inner',how = 'left'/'right'/ 'outer'/ 'inner'
df1 = pd.DataFrame({'col1':[0,1], 'col_left':['a','b']})
df2 = pd.DataFrame({'col1':[1,2,2],'col_right':[2,2,2]})
res = pd.merge(df1, df2, on='col1', how='outer', indicator=True)
#在连接后的表里显示连接的双方哪边有数据
# give the indicator a custom name
res = pd.merge(df1, df2, on='col1', how='outer', indicator='indicator_column')
# 通过索引连接数据框
left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2']},
index=['K0', 'K1', 'K2'])
right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],
'D': ['D0', 'D2', 'D3']},
index=['K0', 'K2', 'K3'])
res = pd.merge(left, right, left_index=True, right_index=True, how='outer')
res = pd.merge(left, right, left_index=True, right_index=True, how='inner')
# handle overlapping 解决进行连接的两个数据框有相同列名的问题
boys = pd.DataFrame({'k': ['K0', 'K1', 'K2'], 'age': [1, 2, 3]})
girls = pd.DataFrame({'k': ['K0', 'K0', 'K3'], 'age': [4, 5, 6]})
res = pd.merge(boys, girls, on='k', suffixes=['_boy', '_girl'], how='inner')
图3.7-1
通过一个键值连接数据框
图3.7-2
通过两个键值连接数据框
图3.7-3
在连接后的表里显示连接的双方哪边有数据
在连接后的表里显示连接的双方哪边有数据-命名
解决重名问题
3.8 pandas plot画图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 对数据列画图
data = pd.Series(np.random.randn(1000), index=np.arange(1000))
data = data.cumsum()
data.plot()
plt.show()
数据列画图
#对数据框数据画图
data = pd.DataFrame(np.random.randn(1000, 4), index=np.arange(1000), columns=list("ABCD"))
data = data.cumsum()
# plot methods:
# 'bar', 'hist', 'box', 'kde', 'area', 'scatter', 'hexbin', 'pie'
ax = data.plot.scatter(x='A', y='B', color='DarkBlue', label="Class 1")
data.plot.scatter(x='A', y='C', color='LightGreen', label='Class 2', ax=ax)
plt.show()
对数据框数据进行画图
照例,文末附上小哥哥的课程地址。