Python科学计算:Pandas

Series

Series 是个定长的字典序列。定长是因为在存储的时候,相当于两个 ndarray,这也是和字典结构最大的不同。因为在字典的结构里,元素的个数是不固定的。

Series有两个基本属性:index 和 values。在 Series 结构中,index 默认是 0,1,2,……递增的整数序列,当然我们也可以自己来指定索引,比如 index=[‘a’, ‘b’, ‘c’, ‘d’]。

import pandas as pd
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)



# 运行结果:
0    1
1    2
2    3
3    4
dtype: int64
a    1
b    2
c    3
d    4
dtype: int64

我们也可以采用字典的方式来创建 Series

d = {'a':1, 'b':2, 'c':3, 'd':4}
x3 = Series(d)
print(x3) 



# 运行结果:
a    1
b    2
c    3
d    4
dtype: int64

DataFrame

import pandas as pd
from pandas import Series, DataFrame
data = {'Chinese': [66, 95, 93, 90,80],'English': [65, 85, 92, 88, 90],'Math': [30, 98, 96, 77, 90]}
df1= DataFrame(data)
df2 = DataFrame(data, index=['ZhangFei', 'GuanYu', 'ZhaoYun', 'HuangZhong', 'DianWei'], columns=['English', 'Math', 'Chinese'])
print(df1)
print(df2)



# 运行结果:
                English  Math  Chinese
ZhangFei         65    30       66
GuanYu           85    98       95
ZhaoYun          92    96       93
HuangZhong       88    77       90
DianWei          90    90       80

数据导入和输出

import pandas as pd
from pandas import Series, DataFrame
score = DataFrame(pd.read_excel('data.xlsx'))
score.to_excel('data1.xlsx')
print(score)


# 在运行的过程可能会存在缺少 xlrd 和 openpyxl 包的情况

数据清洗

data = {'Chinese': [66, 95, 93, 90,80],'English': [65, 85, 92, 88, 90],'Math': [30, 98, 96, 77, 90]}
df2 = DataFrame(data, index=['ZhangFei', 'GuanYu', 'ZhaoYun', 'HuangZhong', 'DianWei'], columns=['English', 'Math', 'Chinese'])

1. 删除 DataFrame 中的不必要的列或行

df2 = df2.drop(columns=['Chinese'])     # 把“语文”这列删掉
df2 = df2.drop(index=['ZhangFei'])       # 把“张飞”这行删掉

2.重命名列名 columns,让列表名更容易识别

df2.rename(columns={'Chinese': 'YuWen', 'English': 'Yingyu'}, inplace = True)

# 把列名 Chinese 改成 YuWen,English 改成 YingYu。

3.去重复的值

df2.drop_duplicates()     # 去除重复行

4.更改数据格式

df2['Chinese'].astype('str') 
df2['Chinese'].astype(np.int64) 
# 把 Chinese 字段的值改成 str 类型,或者 int64     

5.数据间的空格

# 先把格式转成 str 类型

# 删除左右两边空格
df2['Chinese']=df2['Chinese'].map(str.strip)
# 删除左边空格
df2['Chinese']=df2['Chinese'].map(str.lstrip)
# 删除右边空格
df2['Chinese']=df2['Chinese'].map(str.rstrip)


# 删除Chinese 字段里的美元符号
df2['Chinese']=df2['Chinese'].str.strip('$')

6.大小写转换

# 全部大写
df2.columns = df2.columns.str.upper()
# 全部小写
df2.columns = df2.columns.str.lower()
# 首字母大写
df2.columns = df2.columns.str.title()

7.查找空值

df.isnull()       # 哪个地方存在空值 NaN
df.isnull().any()       # 哪列存在空值NaN

8.apply函数  

def double_df(x):
           return 2*x
df1[u'语文'] = df1[u'语文'].apply(double_df)


# 定义 double_df 函数是将原来的数值 *2 进行返回,然后对 df1 中的“语文”列的数值进行 *2 处理
def plus(df,n,m):
    df['new1'] = (df[u'语文']+df[u'英语']) * m
    df['new2'] = (df[u'语文']+df[u'英语']) * n
    return df
df1 = df1.apply(plus,axis=1,args=(2,3,))



# ’new1’列是“语文”和“英语”成绩之和的 m 倍,'new2’列是“语文”和“英语”成绩之和的 n 倍,
# 其中 axis=1 代表竖轴方向进行操作,axis=0 代表横轴方向进行操作,args 是传递的两个参数,即 n=2, m=3,在 plus 函数中使用到了 n 和 m,从而生成新的 df。

数据统计

Pandas 和 NumPy 一样,都有常用的统计函数,如果遇到空值 NaN,会自动排除。

df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
print(df1.describe())

数据表合并

# 创建两个 DataFrame
df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)})
df2 = DataFrame({'name':['ZhangFei', 'GuanYu', 'A', 'B', 'C'], 'data2':range(5)})

1. 基于指定列进行连接

df3 = pd.merge(df1, df2, on='name')

2. inner 内连接

df3 = pd.merge(df1, df2, how='inner')

3.left左连接

df3 = pd.merge(df1, df2, how='left')

4.right右连接

df3 = pd.merge(df1, df2, how='right')

5.outer外连接

df3 = pd.merge(df1, df2, how='outer')

如何用 SQL 方式打开 Pandas

pandasql 中的主要函数是 sqldf,它接收两个参数:一个 SQL 查询语句,还有一组环境变量 globals() 或 locals()。这样我们就可以在 Python 里,直接用 SQL 语句中对 DataFrame 进行操作,举个例子:

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)})
sql = "select * from df1 where name ='ZhangFei'"
print(sqldf(sql, globals()))



# 运行结果:
     data1      name
0      0      ZhangFei

  

  

posted @ 2019-04-06 10:22  小小猎魔人  阅读(290)  评论(0)    收藏  举报