pandas入门

Pandas

本文较为全面的介绍了Pandas的初级用法(平时使用是够了)

包括环境的准备,数据的获取,行列(索引)的增删改查,数据的增删改查,基本所有类似于数据库的操作均已记录

高级部分未记,高级部分包括但不限于(多级索引->索引的索引),按需数据多层分类(数据特征提取分类),数据库操作(ORM -> sqlalchemy)等等

Pandas入门

十分钟入门

准备环境

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

在HTML中显示dataframe

from IPython import display
from IPython.display import HTML
import pandas as pd
import numpy as np
table = pd.DataFrame(np.zeros((3,2)))
html = table.to_html()
display.display(HTML(html))

两套完整的组合拳

# 一,date_range生成时间数组,作为df index行名,columns表示列名,
# 内容中的 np.random.randn(shape)表示为正态分布 
dates = pd.date_range('2020-05-20',periods=6)
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=['A','B','C','D'])

# 二,
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','tarin','test','train']),
                   'F': 'foo'})
df2.dtypes

查看数据

pd.head(rows)/pd.tail(rows) pd.index pd.columns pd.values ->均为属性

df.describe() 快速统计汇总 df.T 转置 df.sort_index(axis=1, ascending=False) 按轴排序,df.sort_values(by='B')按值排序

选择

切片和属性 访问某一列可通过切片 df.A df['A']

访问某一行可通过切片索引(注:直接索引在行不可用)

还有其他切片索引如loc,at和iloc

Pandas库的理解

Series类型

# 自定义索引,可以为常量
b = pd.Series([9,7,5,2],index=['a','b','c','d']) 
# dict->Series
d = pd.Series({'a':4,'d':5,'e':3},index=['a','e','d','b'])
'''
a    4.0
e    3.0
d    5.0
b    NaN
dtype: float64
'''
# numpy
n = pd.Series(np.arange(5),index=np.arange(9,4,-1))
# 类似于字典操作,index->key values->values
b.index    b.values
索引

自定义索引和自动索引并存,但不可混用,可以使用in和get()方法

in 判断索引,且只会判断自定义索引

属性

name属性 b.name='xxx' 指定对象名称 b.index.name = 'index_name' 索引列名

DataFrame

index纵轴索引axis=0,column横轴索引axis=1

d = pd.DataFrame(np.arange(10).reshape(2,5))
df = pd.DataFrame('one':pd.Series([1,2,3],index=['a','b','c'])
                 'two':pd.Series([9,8,7,6],index=['a','b','c','d']))
dl = {'one':[1,2,3,4],'two':[9,8,7,6]}#->column
d = pd.DataFrame(dl,index=['a','b','c','d'])
# d.index d.columns d.values

获取

d.ix[]->获取一行的数据(按照index)取值,直接索引为按照列索引

df = pd.DataFrame(np.random.random((5,4)),index=['a','b','c','d','e'],columns=['A','B','C','D'])
df['A']
df[df.columns[0:3]]
df.loc[:,'A':'C']
df.query('coulmns=="xxx"')
df[df['columns'].isin(["xx","xx"])] --->> df.query('country=="xx1"|country=="xx2"')

增删改

列名和行名的修改

test.rename(columns={0:'a',1:'b'},inplace=True) ->使用列的索引来修改列名

test.rename(index={0:'a',1:'b'},inplace=True) -> 使用行的索引来修改行名

删除行和列
test = pd.DataFrame([[1,2,3],[4,5,6]],index=['A','B'],columns=['C1','C2','C3'])
test.drop(['A'],axis=0)
test.drop(['C2':'C3'],axis=1)
缺失值和数据自动补齐
  • 两个Series相同的索引进行对应数据操作时自动处理,索引不同时会引入NaN值
  • DataFrame中,只有行和列都相同的数据才会对应操作,否则都会自动添加NaN值
  • df.add(df2,fill_value=0)可以为一个缺失值(即运算时部分缺失的数据补充为0),若运算双方均无对应数据,则仍然为NaN
缺失数据的删除
test.dropna(axis='index')
test.dropna(axis=columns)
test.dropna(subset=['C2'],axis='index')
添加新列(数值关联)

df['E'] = df.D.map(lambda x: x**2)-> 新行E数值为D行数值的平方

数据类型操作

重新索引

.reindex()改变或重拍Series DataFrame -> .reinde(index=[]) .reindex(column=[])

# 新增索引
newc = d.columns.insert(4,'add')
# 新增的索引填充数据
newd = d.reindex(columns=newc, fill_value=200)
# 直接删除索引 drop  / delete -> object Index
# drop default axis=0

默认sub,add等函数均axis=0(行),若要使列参与运算,需要设置axis=1(列)

比较运算时,若size不同,程序会报错,'>','==',但一维时会自动广播,默认仍为axis=1

排序

b.sort_index(axis=1,acending=False) #-对列进行排序,默认对行进行升序排列
b.sort_value(2, axis=1,ascending=False) # 对第三行的列进行排序,默认为对列的数值索引进行排序
test = pd.DataFrame([[1,2],[3,4],[2,1]],index=['A','B','C'],columns=['C1','C2'])
test.sort_values(by=['C1'],ascending=True)
# reset_index
test.reset_index(drop=True, inplace=True)

运算

使用describe()来显示基本的运算信息

变形(plotly库时用到)

df = pd.DataFrame(([1,2,3,4,5,6],[7,8,9,10,11,12],[13,14,15,16,17,18]),
                  index=['A','B','C'],
                  columns=['Pop', 'GDP', '1/2', '1/3', '1/4', '1/5'])
df1 = pd.melt(df, id_vars=['Pop','GDP'], var_name = 'date', value_name='Confirmed')
'''
id_vars 保留的列
var_name 展开的列(即从列移到行)
value_name 由于将一列展开,所以对应的列的数据需要用新的列来展开,这里是新的库的列名
'''
# 透视表
pv = pd.pivot(test, index='GDP',columns='data',values='test')

堆叠Stack

略,后续补充

合并和分组

df1 = DataFrame(np.random.randn(3,3))
df2 = DataFrame(np.random.randn(3,3),index=[5,6,7])
# 纵向合并
pd.concat([df1,df2])
# 数组合并(有一列相同的key)
pd.merge()
# -> reduce的使用
test = [1, 2, 3, 4, 5]
functools.reduce(lambda x,y:x+y,test) >> 15
left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                     'A': ['A0', 'A1', 'A2', 'A3'],
                     'B': ['B0', 'B1', 'B2', 'B3']})
middle = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                      'C': ['C0', 'C1', 'C2', 'C3'],
                      'D': ['D0', 'D1', 'D2', 'D3']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                      'E': ['E0', 'E1', 'E2', 'E3'],
                      'F': ['F0', 'F1', 'F2', 'F3']})
functools.reduce(lambda x,y:pd.merge(x,y,on='key'),['left','middle','right'])

GROUP BY 分组

df = DataFrame({'user_id': [5348, 13, 5348], 'course': [12, 45, 23], 'minutes': [9, 36, 45]})
df['user_id'] == 5348
df[df['user_id']==5348]['minutes'].sum()
df.groupby('user_id').sum()
# 高级分组
df = (df.groupby('Name', as_index=False).agg({'Missed':'sum','Credit':'sum','Grade':'mean'}).rename(columns={'Missed':'Sum1', 'Credit':'Sum2','Grade':'Average'}))

文件读取

pd.read_csv(filename,header=None,index_col=0,names=['ID','XX'])
# header:是否第一行作为索引 index_col=0,第一列作为索引
pr.to_csv('filename.csv',header=False,index=False)
# 写入excel
import pandas as pd
import plotly.express as px
# 不使用Writer时为自动覆盖,默认sheet1
minder = px.data.gapminder()
writer = pd.ExcelWriter('minder.xlsx')
minder.to_excel(excel_writer=writer,sheet_name='Sheet1',index=False)
minder.to_excel(excel_writer=writer, sheet_name='Sheet2', index=False, startrow=10)
writer.save()
posted @ 2020-06-09 09:59  WheelCode  阅读(255)  评论(0)    收藏  举报