Pandas入门

Pandas

    • 为什么要学习Pandas
    • Series类型说明
  • 自定义索引
  • 我们也可以把Series当作字典来使用
  • 缺失数据的处理
    • DataFrame类型
  • 构建一个DataFrame
  • DataFrame数据结构 0-1随机数 行索引 列索引
        • DataFrame构造函数 能够接受哪些数据类型呢?
      • pandas重新索引 reindex
      • 算术运算 和 数据对齐
      • DataFrame 和 Series 之间的运算
      • 排序
        • 根据条件对数据集进行排序
      • 针对DataFrame,根据任意一个轴上的索引进行排序
    • 层次化索引
  • 选取子集的操作
  • 内层索引
    • 对于DataFrame,每条轴都可以有分层索引,各层也是都可以有名字的
  • 关于DataFrame类型层次化索引的操作
  • DataFrame类型层次化索引的访问
  • 行和列同时进行访问筛选
  • 根据级别汇总统计
  • 求和运算
  • 根据color2这一行的列索引汇总
    • pandas 文本格式数据处理
  • 大文件如何读取
    • 读取excel数据

#!/usr/bin/env python
# coding: utf-8

为什么要学习Pandas

因为pandas含有 使得数据分析工作变得更快 和 更简单的高级数据结构操作根据
pandas是 基于Numpy来进行构建的,让以 Numpy为中心的应用 变得 更加的简单

# In[1]:


# pip install pandas
# 引入pandas库
import pandas as pd
from pandas import Series, DataFrame


# In[2]:


def pp():
    print('-' * 35)

Series类型说明

这个就是一种类似于一维数组的对象,它是由 一组数据 以及 一组与之相关的数组标签组成(索引)。
仅由一组数据即可产生最简单的Series

# In[3]:


obj = Series([1, 2, 3, 4, 5])
print(obj)
print('-----------')
print(obj.values)
print('-----------')
print(obj.index)

自定义索引

obj = Series(['a', 'b', 'c', 'd', 'e'], index=[1,2,3,4,5])
print(obj)
pp()
print(obj[1], obj[2])

我们也可以把Series当作字典来使用

data = {'a': 10000, 'b': 20000, 'c': 30000}
obj = Series(data) # 此时,Series中索引就是字典中键
print(obj)

pp()

keys = ['a', 'c']
obj_1 = Series(data, index = keys)
print(obj_1)

缺失数据的处理

data = {'a': None, 'b': 20000, 'c': 30000}
obj = Series(data)
print(obj)


# In[7]:


print(pd.isnull(obj))
pp()
print(pd.notnull(obj))
pp()

# 和上面是等价的!!!
print(obj.isnull())
pp()
print(obj.notnull())


# In[8]:


data = {'LiLei': None, 'HanMeimei': 25,
       'Tony': None, 'Jack': 50}

obj = Series(data)
obj.name = '姓名和年龄'
obj.index.name = '姓名'
print(obj)

DataFrame类型

DataFrame是一个表格型的数据结构,它含有一组有序的列。每列可以是不同值的类型、数值、字符串、布尔值都可以
DataFrame本身有行索引,也有列索引
DataFrame也可以理解成是由 Series组成的一个字典

构建一个DataFrame

data = {
    '60年代': ['狗子', '嘎子', '秀儿'],
    '70年代': ['卫国', '建国', '爱国'],
    '80年代': ['李雷', '韩梅梅', '张伟'],
}

frame_Data = DataFrame(data)
print(frame_Data)
pp()
print(frame_Data['70年代'])


# In[13]:


import numpy as np
dates = pd.date_range('20190301', periods = 6)
print(dates)


# In[17]:

DataFrame数据结构 0-1随机数 行索引 列索引

df = pd.DataFrame(np.random.rand(6, 4), index = dates, columns = list('ABCD'))
print(df)


# In[18]:


list('abcd')


# In[20]:


df.T # 转置操作!!


# In[37]:


print(df['20190301': '20190303'])
pp()
print(df.loc['20190301':'20190303', ['A', 'C']])


# In[42]:


df.at[dates[0], 'A']


# In[43]:


df.head(2)


# In[44]:


df.tail(3)

DataFrame构造函数 能够接受哪些数据类型呢?

1、二维numpy array
2、由数组、列表或者是元组组成的字典
3、由Series组成的字典
4、由字典组成的字典
5、字典或Series的列表
6、由列表或元组组成的列表
7、另一个DataFrame

pandas重新索引 reindex

# In[45]:


obj = Series([4.5, 9.8, -1.2], index = ['a', 'b', 'c'])
print(obj)
pp()
obj_1 = obj.reindex(list('abcef')) # 重设行索引
print(obj_1)


# In[47]:


obj.reindex(list('abcef'), fill_value = 1)


# In[51]:


obj = Series([4.5, 9.8, -1.2],index = [0, 2, 4])
print(obj)
pp()
o = obj.reindex(range(6), method='ffill') # ffill:前向填充,bfill:后向填充
o1 = obj.reindex(range(6), method='bfill') # ffill:前向填充,bfill:后向填充
print(o)
pp()
print(o1)

算术运算 和 数据对齐

pandas 的一个重要功能,就是可以对不同索引的对象进行算术运算,在将对象相加时,如果存在不同的索引对,刚结果的索引就是该索引的并集

# In[53]:


d1 = Series([ 1.3, 1.5,  2.6,-3.5], index = list('abcd'))
d2 = Series([-1.3,-1.5, -2.6, 3.9, 9.8], index = list('abcde'))
d1 + d2


# In[54]:


df1 = DataFrame(np.arange(9).reshape((3,3)), columns=list('abc'), index = [1, 2, 3])
print(df1)


# In[56]:


df2 = DataFrame(np.arange(12).reshape((4,3)), columns=list('cde'), index = [1, 2, 3, 4])
print(df2)


# In[66]:


d = df1 + df2
print(d)
pp()
d1 =d.fillna(value=-1)
print(d1)


# In[68]:


df1.add(df2, fill_value=0) 
# 用0来填充不重叠的值。注意:如果本身位置为空,那么还是空
# 只要有一个操作数存在,就不为 NaN

DataFrame 和 Series 之间的运算

# In[69]:


frame = DataFrame(np.arange(12).reshape((4, 3)), columns=list('bde'), index=[1,2,3,4])
series = frame.loc[1] # 选取frame中索引为1的 一行数据

print(frame)
pp()
print(series)


# In[70]:


frame - series # 广播相减,一直向下广播相减


# In[73]:


series = Series(range(3), index = list('bef'))
print(frame)
pp()
print(series)
pp()
frame + series # 相加时,没有就合并。有的列还是广播相加了!!!!

排序

根据条件对数据集进行排序

# In[74]:


obj = Series(range(4), index = list('deab'))
print(obj)
pp()


# In[75]:


obj.sort_index() # 根据索引排序


# In[76]:


obj.sort_values()



针对DataFrame,根据任意一个轴上的索引进行排序

frame = DataFrame(np.arange(8).reshape((2, 4)), index=['two', 'one'], 
                                                columns=list('cdab'))
print(frame)


# In[81]:


frame.sort_index()


# In[82]:


frame.sort_index(axis=1) # 指定轴来排序,轴1是列索引


# In[83]:


frame = DataFrame({'b': [4, 7, 2, -1], # 记住:键指的是列索引
                   'a': [0, 4, 2, 0]})
frame


# In[85]:


frame.sort_values(by='b', ascending=0) # 下降排序(从大到小)

层次化索引

层次化索引是pandas的一项比较重要的功能。它能够让你在一个轴上拥有多个索引级别。另一种说法是它能以低纬度形式处理高纬度数据

# In[86]:


data = Series(np.random.randn(10), index = [list('a'*3 + 'b'*3 + 'c'*2 + 'd'*2), # 一级索引
                                           [1, 2, 3, 4, 5, 6, 7, 8, 1, 2]]) # 二级索引
print(data)


# In[87]:


data.index



选取子集的操作

data['b']


# In[90]:


data['b': 'd']


内层索引

print(data[:,2]) # 第一层索引选择所有的元素,第二层中选择索引为2的元素
pp()
print(data[:][9]) # 选择第二层索引第九个元素


# In[98]:


data.unstack() # 适用unstack方法生成一个新的DataFrame


# In[100]:


ori = data.unstack().stack()
print(ori)
pp()
print(data)

对于DataFrame,每条轴都可以有分层索引,各层也是都可以有名字的

# In[102]:


frame_data = DataFrame(np.arange(12).reshape((4, 3)),   # 初始化
                      index = [list('aabb'), [1,2,1,2]],# 一级行索引,二级行索引 
                      columns = [['Black', 'Yellow', 'bule'], # 一级列索引 
                                 ['Green', 'Red', 'Green']])  # 二级列索引
print(frame_data)


# In[113]:


frame_data.index.names = ['key1', 'key2']      # 给行索引命名
print(frame_data)
# frame_data.columns[2]


# In[114]:


frame_data.columns.names = ['color1', 'color2'] #  给列索引命名
frame_data

关于DataFrame类型层次化索引的操作

# In[134]:


frame_data = DataFrame(np.arange(12).reshape((4, 3)),   # 初始化
                      index = [list('aabb'), [1,2,1,2]],# 一级行索引,二级行索引 
                      columns = [['Black', 'Yellow', 'Black'], # 一级列索引 
                                 ['Green', 'Red', 'Blue']])  # 二级列索引
frame_data.index.names = ['key1', 'key2'] 
frame_data.columns.names = ['color1', 'color2']
print(frame_data)

DataFrame类型层次化索引的访问

frame_data['Black'] # 对列进行筛选

行和列同时进行访问筛选

# 定位行索引列索引
frame_data.loc['a', ['Black']] 

根据级别汇总统计

print(frame_data)
pp()
print(frame_data.index)
pp()

求和运算

frame_data.sum(level='key2') # 根据 key2列的行索引 来 汇总


# In[142]:


frame_data = DataFrame(np.arange(12).reshape((4, 3)),   # 初始化
                      index = [list('aabb'), [1,2,1,2]],# 一级行索引,二级行索引 
                      columns = [['Black', 'Yellow', 'Black'], # 一级列索引 
                                 ['Green', 'Red', 'Green']])  # 二级列索引
frame_data.index.names = ['key1', 'key2'] 
frame_data.columns.names = ['color1', 'color2']
print(frame_data)

根据color2这一行的列索引汇总

frame_data.sum(level= 'color2', axis=1)  


# 轴必须指定为列索引轴,否则会报错


# In[145]:


frame_data.sum(level='color1', axis=1)

pandas 文本格式数据处理

read_csv: 从 文件、url、文件型对象 中加载 带分隔符数据,默认分隔符为逗号
read_table: 从 文件、url、文件型对象中 加载 带分隔符的数据,默认分隔符号为制表符’\t’
read_fwf: 读取 固定宽列格式数据
read_clipboard: 读取 剪切板中的数据,可以看作是read_table的剪切板。可以用在将 网页中的数据 转换为 表格中数据时用到

# In[151]:


get_ipython().system('more data1.csv')


# In[152]:


pd.read_csv('data1.csv')


# In[153]:


pd.read_table('data1.csv',sep = ',')


# In[154]:


pd.read_csv('data1.csv', header=None) # 没有头部,所有文件中的数据都是目标数据,
                                      # 它会自动给你生成头
    


# In[155]:


pd.read_csv('data1.csv', index_col='c') # 指定c列为索引列


# In[156]:


pd.read_csv('data1.csv', index_col=['c', 'd']) # 指定多列为层次化索引


# In[157]:


get_ipython().system('more data2.csv')


# In[159]:


pd.read_csv('data2.csv') # 文件中的NA代表的就是空


# In[165]:


pd.read_csv('data2.csv', skiprows = [1]) 


# 不读取第1行,注意第0行默认为头部


# In[163]:


data = pd.read_csv('data2.csv')
pd.isnull(data) # 判断是否为空


# In[166]:

大文件如何读取

pd.read_csv('data2.csv', nrows= 5) # 指定只读取前五行


# In[167]:


data = pd.read_csv('data2.csv', nrows= 5) # 指定只读取前五行
data.to_csv('data3.csv', sep = '|') # 保存为csv

读取excel数据

# In[168]:


excel = pd.read_excel('data.xlsx')
excel


# In[175]:


excel = pd.read_excel('data.xlsx', sheet_name='Sheet2')
pl = excel.plot(kind = 'line', x = 'age', y = 'place').get_figure()
pl.savefig('1.png')

Pandas入门_第1张图片

# In[176]:


import numpy as np
dates = pd.date_range('20200101', periods=6)
df = pd.DataFrame(np.random.rand(6,4), index=dates, columns=list('ABCD'))
print(df)


# In[177]:


pl = df.plot(kind = 'scatter', x = 'A', y = 'B').get_figure()
pl.savefig('2.png')

Pandas入门_第2张图片

你可能感兴趣的:(NLP,python,数据分析,numpy)