本文翻译整理自,结合K-Lab的工具属性,添加了具体的内容将速查清单里面的代码实践了一遍。
点击右上角的Fork按钮上手实践,即可点击标题实现内容跳转
- [缩写解释 & 库的导入]
- [数据的导入]
- [数据的导出]
- [创建测试对象]
- [数据的查看与检查]
- [数据的选取]
- [数据的清洗]
- [数据的过滤(
filter
),排序(sort
)和分组(groupby
)] - [数据的连接(
join
)与组合(combine
)] - [数据的统计]
df
--- 任意的pandas DataFrame
(数据框)对象
s
--- 任意的pandas Series
(数组)对象pandas
和numpy
是用Python做数据分析最基础且最核心的库 In [2]:
import pandas as pd # 导入pandas库并简写为pdimport numpy as np # 导入numpy库并简写为np
In [1]:
import pandas as pdimport numpy as np
pd.read_csv(filename) # 导入csv格式文件中的数据 pd.read_table(filename) # 导入有分隔符的文本 (如TSV) 中的数据 pd.read_excel(filename) # 导入Excel格式文件中的数据 pd.read_sql(query, connection_object) # 导入SQL数据表/数据库中的数据 pd.read_json(json_string) # 导入JSON格式的字符,URL地址或者文件中的数据 pd.read_html(url) # 导入经过解析的URL地址中包含的数据框 (DataFrame) 数据 pd.read_clipboard() # 导入系统粘贴板里面的数据 pd.DataFrame(dict) # 导入Python字典 (dict) 里面的数据,其中key是数据框的表头,value是数据框的内容。
In [4]:
pd.read_csv(filename) pd.read_table(filename) pd.read_excel(filename) pd.read_sql(query, connection_object) pd.read_json(json_string) pd.read_html(url) pd.read_clipboard() pd.DataFrame(dict)
df.to_csv(filename) # 将数据框 (DataFrame)中的数据导入csv格式的文件中 df.to_excel(filename) # 将数据框 (DataFrame)中的数据导入Excel格式的文件中 df.to_sql(table_name,connection_object) # 将数据框 (DataFrame)中的数据导入SQL数据表/数据库中 df.to_json(filename) # 将数据框 (DataFrame)中的数据导入JSON格式的文件中
In [5]:
df.to_csv(filename) df.to_excel(filename) df.to_sql(table_name, connection_object) df.to_json(filename)
pd.DataFrame(np.random.rand(10,5)) # 创建一个5列10行的由随机浮点数组成的数据框 DataFrame
In [6]:
pd.DataFrame(np.random.rand(10,5))
Out[6]:
In [2]:
pd.DataFrame(np.random.rand(10,5))
Out[2]:
pd.Series(my_list) # 从一个可迭代的对象 my_list 中创建一个数据组
In [7]:
my_list = ['huang', 100, 'xiaolei',4,56] pd.Series(my_list)
Out[7]:
In [3]:
my_list = ['Kesci',100,'欢迎来到科赛网'] pd.Series(my_list)
Out[3]:
df.index = pd.date_range('2017/1/1', periods=df.shape[0]) # 添加一个日期索引 index
In [4]:
df = pd.DataFrame(np.random.rand(10,5)) df.index = pd.date_range('2017/1/1', periods=df.shape[0]) df
Out[4]:
df.head(n) # 查看数据框的前n行
In [9]:
df = pd.DataFrame(np.random.rand(10, 5)) df.head(5)
Out[9]:
In [5]:
df = pd.DataFrame(np.random.rand(10,5)) df.head(3)
Out[5]:
df.tail(n) # 查看数据框的最后n行
In [10]:
df = pd.DataFrame(np.random.rand(15,8)) df.tail(4)
Out[10]:
In [6]:
df = pd.DataFrame(np.random.rand(10,5)) df.tail(3)
Out[6]:
df.shape # 查看数据框的行数与列数
In [11]:
df = pd.DataFrame(np.random.rand(14, 5)) df.shape
Out[11]:
In [7]:
df = pd.DataFrame(np.random.rand(10,5)) df.shape
Out[7]:
df.info() # 查看数据框 (DataFrame) 的索引、数据类型及内存信息
In [13]:
df = pd.DataFrame(np.random.rand(10, 4)) df.info()
In [8]:
df = pd.DataFrame(np.random.rand(10,5)) df.info()
df.describe() # 对于数据类型为数值型的列,查询其描述性统计的内容
In [14]:
df.describe()
Out[14]:
In [9]:
df.describe()
Out[9]:
s.value_counts(dropna=False) # 查询每个独特数据值出现次数统计
In [16]:
s = pd.Series([1,2,5,6,6,6,6,5,5,'huang']) s.value_counts(dropna=False)
Out[16]:
In [10]:
s = pd.Series([1,2,3,3,4,np.nan,5,5,5,6,7]) s.value_counts(dropna=False)
Out[10]:
df.apply(pd.Series.value_counts) # 查询数据框 (Data Frame) 中每个列的独特数据值出现次数统计
In [19]:
pd.DataFrame(np.random.rand(3, 3)) print(df) df.apply(pd.Series.value_counts)
Out[19]:
df[col] # 以数组 Series 的形式返回选取的列
In [23]:
df = pd.DataFrame(np.random.rand(5, 6), columns=list('abcdef')) df['c']
Out[23]:
In [11]:
df = pd.DataFrame(np.random.rand(5,5),columns=list('ABCDE')) df['C']
Out[11]:
df[[col1, col2]] # 以新的数据框(DataFrame)的形式返回选取的列
In [25]:
df = pd.DataFrame(np.random.rand(5, 4), columns=list('abcd')) df[['a','d']]
Out[25]:
In [12]:
df = pd.DataFrame(np.random.rand(5,5),columns=list('ABCDE')) df[['B','E']]
Out[12]:
s.iloc[0] # 按照位置选取
In [11]:
s = pd.Series(np.array(['huang','xiao','lei'])) print(s) s.iloc[1]
Out[11]:
In [13]:
s = pd.Series(np.array(['I','Love','Data'])) s.iloc[0]
Out[13]:
s.loc['index_one'] # 按照索引选取
In [10]:
s = pd.Series(np.array(['df','s','df'])) print(s) s.loc[1]
Out[10]:
In [14]:
s = pd.Series(np.array(['I','Love','Data'])) s.loc[1]
Out[14]:
df.iloc[0,:] # 选取第一行
In [24]:
df = pd.DataFrame(np.random.rand(5, 5),columns= list('abcde')) print(df) #df.iloc[1, :] df.loc[1:3]
Out[24]:
In [15]:
df = pd.DataFrame(np.random.rand(5,5),columns=list('ABCDE')) df.iloc[0,:]
Out[15]:
df.iloc[0,0] # 选取第一行的第一个元素
In [26]:
df = pd.DataFrame(np.random.rand(10, 5), columns=list('asdfg')) print(df) df.iloc[1,3]
Out[26]:
In [16]:
df = pd.DataFrame(np.random.rand(10,5),columns=list('ABCDE')) df.iloc[0,0]
Out[16]:
df.columns = ['a','b'] # 重命名数据框的列名称
In [36]:
df = pd.DataFrame({ 'a':np.array([1,2,5,8,4,3]), 'b':np.array([9,3,7,5,3,4]), 'c':'htl'}) df.columns = ['q','e','r'] df
Out[36]:
In [30]:
df = pd.DataFrame({ 'A':np.array([1,np.nan,2,3,6,np.nan]), 'B':np.array([np.nan,4,np.nan,5,9,np.nan]), 'C':'foo'}) df.columns = ['a','b','c'] df
Out[30]:
pd.isnull() # 检查数据中空值出现的情况,并返回一个由布尔值(True,Fale)组成的列
In [37]:
df = pd.DataFrame({ 'a':np.array([1,np.nan,2,3,6,np.nan]), 'b':np.array([np.nan,4,np.nan,5,9,np.nan]), 'c':'sdf'}) pd.isnull(df)
Out[37]:
In [18]:
df = pd.DataFrame({ 'A':np.array([1,np.nan,2,3,6,np.nan]), 'B':np.array([np.nan,4,np.nan,5,9,np.nan]), 'C':'foo'}) pd.isnull(df)
Out[18]:
pd.notnull() # 检查数据中非空值出现的情况,并返回一个由布尔值(True,False)组成的列
In [39]:
df = pd.DataFrame({ 'a':np.array([1,np.nan,2,3,4,np.nan]), 'b':np.array([np.nan,4,np.nan,5,9,np.nan]), 'c':'foo' }) pd.notnull(df)
Out[39]:
In [40]:
df = pd.DataFrame({ 'A':np.array([1,np.nan,2,3,6,np.nan]), 'B':np.array([np.nan,4,np.nan,5,9,np.nan]), 'C':'foo'}) pd.notnull(df) df.dropna()
Out[40]:
df.dropna() # 移除数据框 DataFrame 中包含空值的行
In [20]:
df = pd.DataFrame({ 'A':np.array([1,np.nan,2,3,6,np.nan]), 'B':np.array([np.nan,4,np.nan,5,9,np.nan]), 'C':'foo'}) df.dropna()
Out[20]:
df.dropna(axis=1) # 移除数据框 DataFrame 中包含空值的列
In [45]:
df = pd.DataFrame({ 'a':np.array([1,np.nan,2,3,4,np.nan]), 'b':np.array([np.nan,4,np.nan,5,9,np.nan]), 'c':'foo' }) print(df) df.dropna(axis=1)
Out[45]:
In [21]:
df = pd.DataFrame({ 'A':np.array([1,np.nan,2,3,6,np.nan]), 'B':np.array([np.nan,4,np.nan,5,9,np.nan]), 'C':'foo'}) df.dropna(axis=1)
Out[21]:
df.dropna(axis=1,thresh=n) # 移除数据框df中空值个数不超过n的行
In [73]:
df = pd.DataFrame({ 'A':np.array([1,np.nan,2,3,6,np.nan]), 'B':np.array([np.nan,4,np.nan,5,9,np.nan]), 'C':'foo'}) print(df) df.dropna(axis=1,thresh=3)
Out[73]:
In [22]:
df = pd.DataFrame({ 'A':np.array([1,np.nan,2,3,6,np.nan]), 'B':np.array([np.nan,4,np.nan,5,9,np.nan]), 'C':'foo'}) test = df.dropna(axis=1,thresh=1) test
Out[22]:
df.fillna(x) # 将数据框 DataFrame 中的所有空值替换为 x
In [76]:
df = pd.DataFrame({ 'A':np.array([1,np.nan,2,3,6,np.nan]), 'B':np.array([np.nan,4,np.nan,5,9,np.nan]), 'C':'foo'}) print(df) df.fillna('huang')
Out[76]:
In [23]:
df = pd.DataFrame({ 'A':np.array([1,np.nan,2,3,6,np.nan]), 'B':np.array([np.nan,4,np.nan,5,9,np.nan]), 'C':'foo'}) df.fillna('Test')
Out[23]:
s.fillna(s.mean())
-> 将所有空值替换为平均值
In [82]:
s = pd.Series([1,3,4,np.nan,7,8,9]) a = s.fillna(s.mean()) print(a)
In [24]:
s = pd.Series([1,3,5,np.nan,7,9,9]) s.fillna(s.mean())
Out[24]:
s.astype(float) # 将数组(Series)的格式转化为浮点数
In [85]:
s = pd.Series([1,2,4,np.nan,5,6,6]) a = s.fillna(s.mean()) a.astype(int)
Out[85]:
In [25]:
s = pd.Series([1,3,5,np.nan,7,9,9]) s.astype(float)
Out[25]:
s.replace(1,'one') # 将数组(Series)中的所有1替换为'one'
In [86]:
s = pd.Series([1,2,4,np.nan,5,6,7]) s.replace(1,'yi')
Out[86]:
In [26]:
s = pd.Series([1,3,5,np.nan,7,9,9]) s.replace(1,'one')
Out[26]:
s.replace([1,3],['one','three']) # 将数组(Series)中所有的1替换为'one', 所有的3替换为'three'
In [87]:
s = pd.Series([1,3,4,np.nan,7,3,5]) s.replace([1,4],['sd', 'dsf'])
Out[87]:
In [27]:
s = pd.Series([1,3,5,np.nan,7,9,9]) s.replace([1,3],['one','three'])
Out[27]:
df.rename(columns=lambda x: x + 2) # 将全体列重命名
In [20]:
df = pd.DataFrame(np.random.rand(4, 4)) df.rename(columns=lambda x:x+2 )
Out[20]:
In [28]:
df = pd.DataFrame(np.random.rand(4,4)) df.rename(columns=lambda x: x+ 2)
Out[28]:
df.rename(columns={ 'old_name': 'new_ name'}) # 将选择的列重命名
In [24]:
df = pd.DataFrame(np.random.rand(10, 5), columns=list('asdfp')) df.rename(columns={ 'a':'huang', 'd':'xiao'})
Out[24]:
In [29]:
df = pd.DataFrame(np.random.rand(10,5),columns=list('ABCDE')) df.rename(columns={ 'A':'newA','C':'newC'})
Out[29]:
df.set_index('column_one') # 改变索引
In [27]:
df = pd.DataFrame(np.random.rand(10, 5), columns=list('asdfg')) print(df) df.set_index('a')
Out[27]:
In [30]:
df = pd.DataFrame(np.random.rand(10,5),columns=list('ABCDE')) df.set_index('B')
Out[30]:
df.rename(index = lambda x: x+ 1) # 改变全体索引
In [29]:
df = pd.DataFrame(np.random.rand(10, 5)) df.rename(index = lambda x: x+1)
Out[29]:
In [31]:
df = pd.DataFrame(np.random.rand(10,5)) df.rename(index = lambda x: x+ 1)
Out[31]:
df[df[col] > 0.5] # 选取数据框df中对应行的数值大于0.5的全部列
In [33]:
df = pd.DataFrame(np.random.rand(10, 5), columns=list('asdfg')) print(df) df[df['a']>0.5]
Out[33]:
In [32]:
df = pd.DataFrame(np.random.rand(10,5),columns=list('ABCDE')) df[df['A'] > 0.5]
Out[32]:
df[(df[col] > 0.5) & (df[col] < 0.7)] # 选取数据框df中对应行的数值大于0.5,并且小于0.7的全部列
In [34]:
df = pd.DataFrame(np.random.rand(10,6),columns= list('qwerty')) df[(df['e'] > 0.5) &(df['t'] < 0.7) ]
Out[34]:
In [33]:
df = pd.DataFrame(np.random.rand(10,5),columns=list('ABCDE')) df[(df['C'] > 0.5) & (df['D'] < 0.7)]
Out[33]:
df.sort_values(col1) # 按照数据框的列col1升序(ascending)的方式对数据框df做排序
In [35]:
df = pd.DataFrame(np.random.rand(10,6),columns=list('adsfgh')) df.sort_values('a')
Out[35]:
In [34]:
df = pd.DataFrame(np.random.rand(10,5),columns=list('ABCDE')) df.sort_values('E')
Out[34]:
df.sort_values(col2,ascending=False) # 按照数据框的列col2降序(descending)的方式对数据框df做排序
In [36]:
df = pd.DataFrame(np.random.rand(10, 8),columns=list('qwertyui')) df.sort_values('e', ascending=False)
Out[36]:
In [35]:
df = pd.DataFrame(np.random.rand(10,5),columns=list('ABCDE')) df.sort_values('A',ascending=False)
Out[35]:
df.sort_values([col1,col2],ascending=[True,False]) # 按照数据框的列col1升序,col2降序的方式对数据框df做排序
In [37]:
df = pd.DataFrame(np.random.rand(5,6),columns=list('qwerty')) df.sort_values(['q', 'w'],ascending=[True, False])
Out[37]:
In [36]:
df = pd.DataFrame(np.random.rand(10,5),columns=list('ABCDE')) df.sort_values(['A','E'],ascending=[True,False])
Out[36]:
df.groupby(col) # 按照某列对数据框df做分组
In [3]:
df = pd.DataFrame({ 'a':np.array(['huang','huang','huang','xiao','xiao','xiao']), 'b':np.array(['lei','lei','lei','xiao','xiao','lei']), 'c':np.array(['small','medium','large','small','large','medium']), 'd':np.array([1,2,3,4,5,6]) }) df.groupby('a').count()
Out[3]:
In [38]:
df = pd.DataFrame({ 'A':np.array(['foo','foo','foo','foo','bar','bar']), 'B':np.array(['one','one','two','two','three','three']), 'C':np.array(['small','medium','large','large','small','small']), 'D':np.array([1,2,2,3,3,5])}) print(df) df.groupby('A').count()
Out[38]:
df.groupby([col1,col2]) # 按照列col1和col2对数据框df做分组
In [4]:
df = pd.DataFrame({ 'a':np.array(['s','s','s','e','e','e']), 'b':np.array(['q','w','e','e','e','w']), 'c':np.array(['t','t','t','hu','hi','jk']) }) print(df) df.groupby(['a','b']).count()
Out[4]:
In [39]:
df = pd.DataFrame({ 'A':np.array(['foo','foo','foo','foo','bar','bar']), 'B':np.array(['one','one','two','two','three','three']), 'C':np.array(['small','medium','large','large','small','small']), 'D':np.array([1,2,2,3,3,5])}) print(df) df.groupby(['B','C']).sum()
Out[39]:
df.groupby(col1)[col2].mean() # 按照列col1对数据框df做分组处理后,返回对应的col2的平均值
In [10]:
df = pd.DataFrame({ 'a':np.array(['ho','ho','ho','e','e','e']), 'b':np.array(['huang','huang','lei','lei','xiao','xiao']), 'c':np.array([1,2,3,4,5,6]) }) df.groupby('a')['c'].mean()
Out[10]:
In [39]:
df = pd.DataFrame({ 'A':np.array(['foo','foo','foo','foo','bar','bar']), 'B':np.array(['one','one','two','two','three','three']), 'C':np.array(['small','medium','large','large','small','small']), 'D':np.array([1,2,2,3,3,5])}) df.groupby('B')['D'].mean()
Out[39]:
pythyondf.pivot_table(index=col1,values=[col2,col3],aggfunc=mean) # 做透视表,索引为col1,针对的数值列为col2和col3,分组函数为平均值
In [11]:
df = pd.DataFrame({ 'A':np.array(['foo','foo','foo','foo','bar','bar']), 'B':np.array(['one','one','two','two','three','three']), 'C':np.array(['small','medium','large','large','small','small']), 'D':np.array([1,2,2,3,3,5])}) print(df) df.pivot_table(df,index=['A','B'], columns=['C'],aggfunc=np.sum)
Out[11]:
df.groupby(col1).agg(np.mean)
In [12]:
df = pd.DataFrame({ 'A':np.array(['foo','foo','foo','foo','bar','bar']), 'B':np.array(['one','one','two','two','three','three']), 'C':np.array(['small','medium','large','large','small','small']), 'D':np.array([1,2,2,3,3,5])}) print(df) df.groupby('A').agg(np.mean)
Out[12]:
df.apply(np.mean) # 对数据框df的每一列求平均值
In [13]:
df = pd.DataFrame(np.random.rand(10, 5),columns=list('adsfg')) df.apply(np.mean)
Out[13]:
In [42]:
df = pd.DataFrame(np.random.rand(10,5),columns=list('ABCDE')) df.apply(np.mean)
Out[42]:
df.apply(np.max,axis=1) # 对数据框df的每一行求最大值
In [14]:
df = pd.DataFrame(np.random.rand(10, 6),columns=list('asdfrg')) df.apply(np.max, axis=1)
Out[14]:
In [43]:
df = pd.DataFrame(np.random.rand(10,5),columns=list('ABCDE')) df.apply(np.max,axis=1)
Out[43]:
df1.append(df2) # 在数据框df2的末尾添加数据框df1,其中df1和df2的列数应该相等
In [44]:
df1 = pd.DataFrame({ 'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3'], 'C': ['C0', 'C1', 'C2', 'C3'], 'D': ['D0', 'D1', 'D2', 'D3']}, index=[0, 1, 2, 3]) df2 = pd.DataFrame({ 'A': ['A4', 'A5', 'A6', 'A7'], 'B': ['B4', 'B5', 'B6', 'B7'], 'C': ['C4', 'C5', 'C6', 'C7'], 'D': ['D4', 'D5', 'D6', 'D7']}, index=[4, 5, 6, 7]) df1.append(df2)
Out[44]:
pd.concat([df1, df2],axis=1) # 在数据框df1的列最后添加数据框df2,其中df1和df2的行数应该相等
In [45]:
df1 = pd.DataFrame({ 'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3'], 'C': ['C0', 'C1', 'C2', 'C3'], 'D': ['D0', 'D1', 'D2', 'D3']}, index=[0, 1, 2, 3]) df2 = pd.DataFrame({ 'A': ['A4', 'A5', 'A6', 'A7'], 'B': ['B4', 'B5', 'B6', 'B7'], 'C': ['C4', 'C5', 'C6', 'C7'], 'D': ['D4', 'D5', 'D6', 'D7']}, index=[4, 5, 6, 7]) pd.concat([df1,df2],axis=1)
Out[45]:
df1.join(df2,on=col1,how='inner') # 对数据框df1和df2做内连接,其中连接的列为col1
In [46]:
df1 = pd.DataFrame({ 'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3'], 'key': ['K0', 'K1', 'K0', 'K1']}) df2 = pd.DataFrame({ 'C': ['C0', 'C1'], 'D': ['D0', 'D1']}, index=['K0', 'K1']) df1.join(df2, on='key')
Out[46]:
<div id = 'p10'>数据的统计</div>
df.describe() # 得到数据框df每一列的描述性统计
In [4]:
df = pd.DataFrame(np.random.rand(10, 5),columns=list('abcde')) df.describe()
Out[4]:
In [47]:
df = pd.DataFrame(np.random.rand(10,5),columns=list('ABCDE')) df.describe()
Out[47]:
df.mean() # 得到数据框df中每一列的平均值
In [6]:
df = pd.DataFrame(np.random.rand(10, 5),columns=list('abcde')) df.mean()
Out[6]:
In [5]:
df = pd.DataFrame(np.random.rand(10,5),columns=list('ABCDE')) df.mean()
Out[5]:
df.corr() # 得到数据框df中每一列与其他列的相关系数
In [7]:
df = pd.DataFrame(np.random.rand(10, 5),columns=list('abcde')) df.corr()
Out[7]:
In [49]:
df = pd.DataFrame(np.random.rand(10,5),columns=list('ABCDE')) df.corr()
Out[49]:
df.count() # 得到数据框df中每一列的非空值个数
In [8]:
df = pd.DataFrame(np.random.rand(10, 5),columns=list('abcde')) df.count()
Out[8]:
In [50]:
df = pd.DataFrame(np.random.rand(10,5),columns=list('ABCDE')) df.count()
Out[50]:
df.max() # 得到数据框df中每一列的最大值
In [12]:
df = pd.DataFrame(np.random.rand(10, 5),columns=list('abcde')) print(df) print(df.max()) df.count()
Out[12]:
In [51]:
df = pd.DataFrame(np.random.rand(10,5),columns=list('ABCDE')) df.max()
Out[51]:
df.min() # 得到数据框df中每一列的最小值
In [52]:
df = pd.DataFrame(np.random.rand(10,5),columns=list('ABCDE')) df.min()
Out[52]:
df.median() # 得到数据框df中每一列的中位数
In [53]:
df = pd.DataFrame(np.random.rand(10,5),columns=list('ABCDE')) df.median()
Out[53]:
df.std() # 得到数据框df中每一列的标准差
In [54]:
df = pd.DataFrame(np.random.rand(10,5),columns=list('ABCDE')) df.std()
Out[54]: