#!/usr/bin/env python
# coding: utf-8
因为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
# 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])
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也可以理解成是由 Series组成的一个字典
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]:
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)
1、二维numpy array
2、由数组、列表或者是元组组成的字典
3、由Series组成的字典
4、由字典组成的字典
5、字典或Series的列表
6、由列表或元组组成的列表
7、另一个DataFrame
# 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
# 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()
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)
# 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
# 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)
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)
frame_data.sum(level= 'color2', axis=1)
# 轴必须指定为列索引轴,否则会报错
# In[145]:
frame_data.sum(level='color1', axis=1)
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
# 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')
# 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')