05. Python科学计算:Pandas
2019-02-15 本文已影响19人
进击的原点
数据结构:Series 和 DataFrame
- Series: 是一个定长的字典序列。有两个基本属性:index,values
from pandas import Series, DataFrame
x1 = Series([1,2,3,4])
x2 = Series(data=[1,2,3,4], index=['a', 'b', 'c', 'd'])
print (x1)
print (x2)
运行结果:
1 2
2 3
3 4
dtype: int64
a 1
b 2
c 3
d 4
dtype: int64
我们也可以采用字典的方式来创建 Series,比如:
- DataFrame: 类似于数据库表的一种数据结构。我们甚至可以像操作数据库表那样对DataFrame数据进行
df1= DataFrame(data)
df2 = DataFrame(data, index=['ZhangFei', 'GuanYu', 'ZhaoYun', 'HuangZhong', 'DianWei'], columns=['English', 'Math', 'Chinese'])
print (df1)
print (df2)
运行结果:
Chinese English Math
0 66 65 30
1 95 85 98
2 93 92 96
3 90 88 77
4 80 90 90
English Math Chinese
ZhangFei 65 30 66
GuanYu 85 98 95
ZhaoYun 92 96 93
HuangZhong 88 77 90
DianWei 90 90 80
数据导入和输出
from pandas import Series, DataFrame
score = DataFrame(pd.read_excel('data.xlsx'))
score.to_excel('data1.xlsx')
print score
数据清洗
- 删除 DataFrame 中的不必要的列或行
df2 = df2.drop(columns=['Chinese'])
- 重命名列名
df2.rename(columns={'Chinese': 'YuWen', 'English': 'Yingyu'}, inplace = True)
- 去重复的值
df = df.drop_duplicates() # 去除重复行
- 格式问题
- 更改数据格式
df2['Chinese'].astype('str')
df2['Chinese'].astype(np.int64)
- 数据间的空格
# 删除左右两边空格
df2['Chinese']=df2['Chinese'].map(str.strip)
# 删除左边空格
df2['Chinese']=df2['Chinese'].map(str.lstrip)
# 删除右边空格
df2['Chinese']=df2['Chinese'].map(str.rstrip)
有没有符号想删掉,怎么写
df2['Chinese']=df2['Chinese'].str.strip('$')
- 大小写的转换
# 全部大写
df2.columns = df2.columns.str.upper()
# 全部小写
df2.columns = df2.columns.str.lower()
# 首字母大写
df2.columns = df2.columns.str.title()
- 查找空值
df.isnull()
使用apply函数进行清洗
df['name'] = df['name'].apply(str.upper)
数据统计
image.pngdescribe 函数是个大礼包,里面包含各类统计
df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
print df1.describe()
运行结果
data1
count 5.000000
mean 2.000000
std 1.581139
min 0.000000
25% 1.000000
50% 2.000000
75% 3.000000
max 4.000000
数据表合并
df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
df2 = DataFrame({'name':['ZhangFei', 'GuanYu', 'A', 'B', 'C'], 'data2':range(5)})
创建两个 DataFrame作为测试数据
- 基于指定列进行连接
- Inner内连接
- left左连接
- right右连接
- outer外连接
# 基于指定列连接
df3 = pd.merge(df1, df2, on='name')
# inner内连接
df3 = pd.merge(df1, df2, how='inner')
# left左连接
df3 = pd.merge(df1, df2, how='left')
# right右连接
df3 = pd.merge(df1, df2, how='right')
# outer外连接
df3 = pd.merge(df1, df2, how='outer')
如何用 SQL 方式打开 Pandas
pandasql
import pandas as pd
from pandas import DataFrame
from pandasql import sqldf, load_meat, load_births
df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
pysqldf = lambda sql: sqldf(sql, globals())
sql = "select * from df1 where name ='ZhangFei'"
print pysqldf(sql)
运行结果:
data1 name
0 0 ZhangFei
image.png