ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Pandas的使用

2022-05-21 21:32:48  阅读:171  来源: 互联网

标签:Chinese df English DataFrame 使用 90 Pandas Math


在数据分析工作中,Pandas 的使用频率是很高的,一方面是因为 Pandas 提供的基础数据结构 DataFrame 与 json 的契合度很高,转换起来很方便。另一方面,如果日常的数据清理工作不是很复杂的话,通常用几句 Pandas 代码就可以对数据进行规整。

基本数据结构

Series 和 DataFrame是pandas的两个核心数据结构,分别代表着一维的序列和二维的表结构。基于这两种数据结构,Pandas 可以对数据进行导入、清洗、处理、统计和输出。

Series 是个定长的字典序列,有两个基本属性:index 和 values

在 Series 结构中,index 默认是 0,1,2,……递增的整数序列,也可以自定义索引,比如 index=['a','b','c']。同时可以采用字典的方式来创建 Series。

from pandas import Series

x1 = Series([1, 2, 3, 4])
x2 = Series(data=[1, 2, 3, 4], index=['a', 'b', 'c', 'd']) # 自定义索引
d = {'a': 1, 'b': 2, 'c': 3, 'd': 4} # 通过字典创建
x3 = Series(d)
print(x1)
print(x2)
print(x3)

运行

0    1
1    2
2    3
3    4
dtype: int64
a    1
b    2
c    3
d    4
dtype: int64
a    1
b    2
c    3
d    4
dtype: int64

DataFrame 类型数据结构类似数据库表,它包括了行索引和列索引,可以将 DataFrame 看成是由相同索引的 Series 组成的字典类型。

虚构一个考试场景,A、B、C、D、E五人有各自的语数外成绩

from pandas import 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=['A', 'B', 'C', 'D', 'E'], 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
A       65    30       66
B       85    98       95
C       92    96       93
D       88    77       90
E       90    90       80

上述代码中,df2 的列索引是[''English', 'Math', 'Chinese'],行索引是['A', 'B', 'C', 'D', 'E']

数据导入和输出

Pandas 允许直接从 xlsx,csv 等文件中导入数据,也可以输出到 xlsx, csv 等文件

import pandas as pd
from pandas import Series, DataFrame
score = DataFrame(pd.read_excel('data.xlsx')) # 读取文件
score.to_excel('data1.xlsx') # 保存文件
print(score)

数据清洗

数据清洗是数据准备过程中必不可少的环节

初始数据

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]}
df = DataFrame(data, index=['A', 'B', 'C', 'D', 'E'], columns=['English', 'Math', 'Chinese'])

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

Pandas 提供了一个方法 drop() 函数来删除列或行。比如把"Chinese"这列删掉。

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]}
df = DataFrame(data, index=['A', 'B', 'C', 'D', 'E'], columns=['English', 'Math', 'Chinese'])
df = df.drop(columns=['Chinese'])
print(df)

输出

   English  Math
A       65    30
B       85    98
C       92    96
D       88    77
E       90    90

将"A"删掉

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]}
df = DataFrame(data, index=['A', 'B', 'C', 'D', 'E'], columns=['English', 'Math', 'Chinese'])
df = df.drop(index=['A'])
print(df)

输出

   English  Math  Chinese
B       85    98       95
C       92    96       93
D       88    77       90
E       90    90       80

重命名列名

如果想对 DataFrame 中的 columns 进行重命名,可以直接使用 rename(columns=new_names, inplace=True) 函数,比如把列名 Chinese 改成 YuWen,English 改成 YingYu。

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]}
df = DataFrame(data, index=['A', 'B', 'C', 'D', 'E'], columns=['English', 'Math', 'Chinese'])
df.rename(columns={'Chinese': 'YuWen', 'English': 'Yingyu'}, inplace=True)
print(df)

输出

   Yingyu  Math  YuWen
A      65    30     66
B      85    98     95
C      92    96     93
D      88    77     90
E      90    90     80

去除重复行

df = df.drop_duplicates() #去除重复行

更改数据格式

很多时候数据格式不规范,可以使用 astype 函数来规范数据格式,比如把 Chinese 字段的值改成 str 类型,或者 int64 :

df['Chinese'].astype('str')       # 改为str
df['Chinese'].astype(numpy.int64) # 改为int64

删除字符

如果数据里有某个特殊的符号要删除,可以使用 strip 函数,比如 Chinese 字段里有美元符号:

df['Chinese']=df['Chinese'].str.strip('$')

大小写转换

大小写是个比较常见的操作,比如人名、城市名等的统一都可能用到大小写的转换,在 Python 里直接使用 upper(), lower(), title() 函数,方法如下:

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

查找空值

数据量大的情况下,有些字段存在空值 NaN 的可能,这时就使用 Pandas 中的 isnull 函数进行查找。如果想看哪个地方存在空值 NaN,可以针对数据表 df 进行 df.isnull(),如果想知道哪列存在空值,可以使用 df.isnull().any()

使用 apply 进行数据清洗

apply 函数是 Pandas 中自由度非常高的函数,使用频率也非常高。

比如想对 name 列的数值都进行大写转化可以用:

df['name'] = df['name'].apply(str.upper)

也可以自定义函数,在 apply 中进行使用。比如定义 double_df 函数是将原来的数值 *2 进行返回。然后对 df1 中的“语文”列的数值进行 *2 处理,可以写成:

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]}
df = DataFrame(data, index=['A', 'B', 'C', 'D', 'E'], columns=['English', 'Math', 'Chinese'])

def double_df(x): # 定义函数
    return 2 * x

df["Chinese"] = df["Chinese"].apply(double_df)
print(df)

也可以定义更复杂的函数,比如对于 DataFrame,可以新增两列,其中’new1’列是“语文”和“英语”成绩之和的 m 倍,'new2’列是“语文”和“英语”成绩之和的 n 倍,可以这样写:

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]}
df = DataFrame(data, index=['A', 'B', 'C', 'D', 'E'], columns=['English', 'Math', 'Chinese'])

def plus(df, n, m):
    df['new1'] = (df["Chinese"]+df["English"]) * m
    df['new2'] = (df["Chinese"]+df["English"]) * n
    return df

df = df.apply(plus, axis=1, args=(2, 3,))
print(df)

输出

   English  Math  Chinese  new1  new2
A       65    30       66   393   262
B       85    98       95   540   360
C       92    96       93   555   370
D       88    77       90   534   356
E       90    90       80   510   340

数据统计

数据清洗后要进行数据统计

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

函数 作用
count 统计个数,空值NaN不计算
describe 一次性输出多个统计指标,包括:count,mean,std,min,max等
min 最小值
max 最大值
sum 总和
mean 平均值
median 中位数
var 方差
std 标准差
argmin 统计最小值的索引位置
argmax 统计最大值的索引位置
idxmin 统计最小值的索引位置
idxmax 统计最大值的索引位置

describe可以给出一个整体的统计

df = DataFrame({'name': ['A', 'B', 'C', 'D', 'E'], 'data': range(5)})
print(df.describe())

运行

           data
count  5.000000
mean   2.000000
std    1.581139
min    0.000000
25%    1.000000
50%    2.000000
75%    3.000000
max    4.000000

数据表合并

一个 DataFrame 相当于一个数据库的数据表,那么多个 DataFrame 数据表的合并就相当于多个数据库的表合并。

两个 DataFrame 数据表的合并使用的是 merge() 函数,有下面 5 种形式:

基于指定列进行连接

基于 name 这列进行连接

import pandas as pd
from pandas import Series, DataFrame

df1 = DataFrame({'name': ['A', 'B', 'C', 'D', 'E'], 'data1': range(5)})
df2 = DataFrame({'name': ['A', 'B', 'C', 'D', 'F'], 'data2': range(5)})
df3 = pd.merge(df1, df2, on='name')
print(df3)

输出

  name  data1  data2
0    A      0      0
1    B      1      1
2    C      2      2
3    D      3      3

inner 内连接

nner 内链接是 merge 合并的默认情况,inner 内连接其实也就是键的交集,在这里 df1, df2 相同的键是 name,所以是基于 name 字段做的连接:

df1 = DataFrame({'name': ['A', 'B', 'C', 'D', 'E'], 'data1': range(5)})
df2 = DataFrame({'name': ['A', 'B', 'C', 'D', 'F'], 'data2': range(5)})
df3 = pd.merge(df1, df2, how='inner')
print(df3)

输出

  name  data1  data2
0    A      0      0
1    B      1      1
2    C      2      2
3    D      3      3

left 左连接

左连接是以第一个 DataFrame 为主进行的连接,第二个 DataFrame 作为补充。

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

输出

  name  data1  data2
0    A      0    0.0
1    B      1    1.0
2    C      2    2.0
3    D      3    3.0
4    E      4    NaN

right 右连接

右连接是以第二个 DataFrame 为主进行的连接,第一个 DataFrame 作为补充。

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

输出

  name  data1  data2
0    A    0.0      0
1    B    1.0      1
2    C    2.0      2
3    D    3.0      3
4    F    NaN      4

outer 外连接

外连接相当于求两个 DataFrame 的并集。

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

输出

  name  data1  data2
0    A    0.0    0.0
1    B    1.0    1.0
2    C    2.0    2.0
3    D    3.0    3.0
4    E    4.0    NaN
5    F    NaN    4.0

用 SQL 方式打开 Pandas

在 Python 里可以直接使用 SQL 语句来操作 Pandas

pandasql 中的主要函数是 sqldf,它接收两个参数:一个 SQL 查询语句,还有一组环境变量 globals() 或 locals()。

示例

from pandas import DataFrame
from pandasql import sqldf, load_meat, load_births

df1 = DataFrame({'name': ['A', 'B', 'C', 'D', 'E'], 'data1': range(5)})
pysqldf = lambda sql: sqldf(sql, globals())
sql = "select * from df1 where name ='A'"
print(pysqldf(sql))

输出

  name  data1
0    A      0

标签:Chinese,df,English,DataFrame,使用,90,Pandas,Math
来源: https://www.cnblogs.com/N3ptune/p/16296067.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有