Pandas 应用

Pandas 的主要数据结构是 Series (一维数据)与 DataFrame(二维数据),这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数典型用例。

数据结构

Series 是一种类似于一维数组的对象,它由一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(即索引)组成。

DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。

Pandas 安装

pip install pandas

安装成功后,我们就可以导入 pandas 包使用:
import pandas as pd

实例 – 查看 pandas 版本

import pandas as pd
 pd.__version__  # 查看版本

 

Pandas 数据结构 – Series

Pandas Series 类似表格中的一个列(column),类似于一维数组,可以保存任何数据类型。

Series 由索引(index)和列组成,函数如下:

pandas.Series( data, index, dtype, name, copy)

参数说明:

  • data:一组数据(ndarray 类型)。

  • index:数据索引标签,如果不指定,默认从 0 开始。

  • dtype:数据类型,默认会自己判断。

  • name:设置名称。

  • copy:拷贝数据,默认为 False。

 

实例:

import pandas as pd
print(pd.__version__)
# 定义字典
mydataset = {
  'sites': ["Google", "Runoob", "Wiki"],
  'number': [1, 2, 3]
}
# 将字典转换
myvar = pd.DataFrame(mydataset)
print(myvar)

print("*"*50)

# 将列表转换为Series
a=[1,2,3]
myvar=pd.Series(a)
print(myvar)

print("*"*50)

# 指定series的索引值
a = ["Google", "Runoob", "Wiki"]
myvar = pd.Series(a, index = ["x", "y", "z"])
print(myvar["y"])

print("*"*50)

# 也可以使用 key/value 对象,类似字典来创建 Series:
sites = {1: "Google", 2: "Runoob", 3: "Wiki"}
myvar=pd.Series(sites)
print(myvar)

print("*"*50)

# 只需要字典中的一部分数据,只需要指定需要数据的索引即可
sites = {1: "Google", 2: "Runoob", 3: "Wiki"}
myvar=pd.Series(sites,index=[1,2])
print(myvar)

 

Pandas 数据结构 – DataFrame

DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。

DataFrame 构造方法如下:

pandas.DataFrame( data, index, columns, dtype, copy)

参数说明:

  • data:一组数据(ndarray、series, map, lists, dict 等类型)。

  • index:索引值,或者可以称为行标签。

  • columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) 。

  • dtype:数据类型。

  • copy:拷贝数据,默认为 False。

Pandas DataFrame 是一个二维的数组结构,类似二维数组。

import pandas as pd
# Pandas DataFrame 是一个二维的数组结构,类似二维数组。
data = [['Google',10],['Runoob',12],['Wiki',13]]
df = pd.DataFrame(data,columns=['Site','Age'],dtype=float)
print(df)

print("*"*50)


data = {'Site':['Google', 'Runoob', 'Wiki'], 'Age':[10, 12, 13]}
df=pd.DataFrame(data)
print(df)

print("*"*50)

# 从以上输出结果可以知道, DataFrame 数据类型一个表格,包含 rows(行) 和 columns(列),还可以使用字典(key/value),其中字典的 key 为列名:
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data)
print(df)

print("*"*50)

# Pandas 可以使用 loc 属性返回指定行的数据,如果没有设置索引,第一行索引为 0,第二行索引为 1,以此类推:
data = {
  "calories": [420, 380, 390],
  "duration": [50, 40, 45]
}
#数据载入到DataFrame对象
df=pd.DataFrame(data)
#返回第一行
print(df.loc[0])
#返回第三行
print(df.loc[2])
# 也可以返回多行数据,使用 [[ ... ]] 格式,... 为各行的索引,以逗号隔开:
print(df.loc[[0, 1]])

print("*"*50)

# 可以指定索引值
data = {
  "calories": [420, 380, 390],
  "duration": [50, 40, 45]
}
df = pd.DataFrame(data,index=["d1","d2","d3"])
print(df)
# Pandas 可以使用 loc 属性返回指定索引对应到某一行
print(df.loc["d2"])

 

Pandas CSV 文件

CSV(Comma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。

CSV 是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。

#实例
import pandas as pd

df = pd.read_csv('nba.csv')

print(df.to_string())

to_string() 用于返回 DataFrame 类型的数据,如果不使用该函数,则输出结果为数据的前面 5 行和末尾 5 行,中间部分以 … 代替。

 

import pandas as pd
df = pd.read_csv("nba.csv")
# print(df.to_string())
df.to_csv('nba.csv')
#读取前5行(默认5行)
print(df.head())
#读取前10行
# print(df.head(10))

#读取尾部行号(默认5行)
# print(df.tail(10))

# info() 方法返回表格的一些基本信息:
print(df.info())

# 也可以使用 to_csv() 方法将 DataFrame 存储为 csv 文件
# 三个字段 name, site, age
nme = ["Google", "Runoob", "Taobao", "Wiki"]
st = ["www.google.com", "www.runoob.com", "www.taobao.com", "www.wikipedia.org"]
ag = [90, 40, 80, 98]
# 字典
dict = {'name': nme, 'site': st, 'age': ag}
#将字典转换为DataFrame
df02=pd.DataFrame(dict)

df02.to_csv('site.csv')

 

Pandas JSON

JSON(JavaScript Object Notation,JavaScript 对象表示法),是存储和交换文本信息的语法,类似 XML。

一组json数据

[
   {
   "id": "A001",
   "name": "菜鸟教程",
   "url": "www.runoob.com",
   "likes": 61
   },
   {
   "id": "A002",
   "name": "Google",
   "url": "www.google.com",
   "likes": 124
   },
   {
   "id": "A003",
   "name": "淘宝",
   "url": "www.taobao.com",
   "likes": 45
   }
]

 

实例:

import pandas as pd
import json
df = pd.read_json('sites.json')
# print(df.to_string())



# JSON 对象与 Python 字典具有相同的格式,所以我们可以直接将 Python 字典转化为 DataFrame 数据
# 字典格式的 JSON
s = {
    "col1":{"row1":1,"row2":2,"row3":3},
    "col2":{"row1":"x","row2":"y","row3":"z"}
}
# 读取 JSON 转为 DataFrame
df02=pd.DataFrame(s)
# print(df02)



# 从 URL 中读取 JSON 数据
URL='https://static.runoob.com/download/sites.json'
df03 = pd.read_json(URL)
# print(df03)



# 内嵌的 JSON 数据
df04 = pd.read_json('nested_list.json')
# print(df04.to_string())

# 这时我们就需要使用到 json_normalize() 方法将内嵌的数据完整的解析出来
# 使用 Python JSON 模块载入数据
with open('nested_list.json','r') as f:
    data = json.loads(f.read())
#展平数据
df_list = pd.json_normalize(data,
                            record_path=['students'],
                            meta=['school_name','class'])
print(df_list)

 

Pandas 数据清洗

数据清洗是对一些没有用的数据进行处理的过程。

很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况,如果要对使数据分析更加准确,就需要对这些没有用的数据进行处理。

 

import pandas as pd
# 要删除包含空字段的行,可以使用 dropna() 方法
# 通过 isnull() 判断各个单元格是否为空
df = pd.read_csv('property-data.csv')
print(df['NUM_BEDROOMS'])
print(df['NUM_BEDROOMS'].isnull())

print("——"*50)

# 以上例子中我们看到 Pandas 把 n/a 和 NA 当作空数据,
# na 不是空数据,不符合我们要求,我们可以指定空数据类型:

missing_value=['n/a','na','--']
df02 = pd.read_csv('property-data.csv',na_values=missing_value)
print(df02['NUM_BEDROOMS'])
print(df02['NUM_BEDROOMS'].isnull())


print("——"*50)

# 删除包含空数据的行
df03 = pd.read_csv('property-data.csv')
new_df03 = df03.dropna()
print(new_df03.to_string())


print("——"*50)


# 默认情况下,dropna() 方法返回一个新的 DataFrame,不会修改源数据。
# 如果你要修改源数据 DataFrame, 可以使用 inplace = True 参数:
df04 = pd.read_csv('property-data.csv')
df04.dropna(inplace=True)
print(df04.to_string())


print("——"*50)


# 移除 ST_NUM 列中字段值为空的行:
df05 = pd.read_csv('property-data.csv')
df05.dropna(subset=['ST_NUM'],inplace=True)
print(df05)



print("——"*50)


#  fillna() 方法来替换一些空字段:
df06 = pd.read_csv('property-data.csv')
df06.fillna(12345,inplace=True)
print(df06.to_string())


print("——"*50)

# 也可以指定某一个列来替换数据:使用 999 替换 PID 为空的数据
df07 = pd.read_csv('property-data.csv')
df07['PID'].fillna(999,inplace=True)
print(df07.to_string())


print("——"*50)


# Pandas使用 mean()、median() 和 mode()
# 方法计算列的均值(所有值加起来的平均值)、中位数值(排序后排在中间的数)和众数(出现频率最高的数)
# 使用 mean() 方法计算列的均值并替换空单元格:
df08 = pd.read_csv('property-data.csv')
x = df["ST_NUM"].mean()
df08.fillna(x,inplace=True)
print(df08.to_string())
# 使用 median() 方法计算列的中位数并替换空单元格:
df08 = pd.read_csv('property-data.csv')
x=df['ST_NUM'].median()
df08.fillna(x,inplace=True)
print(df08.to_string())


print("——"*50)

# Pandas 清洗格式错误数据
# 第三个日期格式错误
data = {
  "Date": ['2020/12/01', '2020/12/02' , '20201226'],
  "duration": [50, 40, 45]
}
df09 = pd.DataFrame(data,index=['d1','d2','d3'])
df09['Date'] = pd.to_datetime(df09['Date'])
print(df09.to_string())

print("——"*50)



# Pandas 清洗错误数据
person = {
  "name": ['Google', 'Runoob' , 'Taobao'],
  "age": [50, 40, 12345]    # 12345 年龄数据是错误的
}
df10 = pd.DataFrame(person)
# 修改错误的年龄
df10.loc[2,'age']=30
print(df10.to_string())

# 也可以设置条件语句:
person = {
  "name": ['Google', 'Runoob' , 'Taobao'],
  "age": [50, 40, 12345]    # 12345 年龄数据是错误的
}
df10 = pd.DataFrame(person)
for x in df10.index:
    if df10.loc[x,'age']>120:
        df10.loc[x,'age']=18
print(df10.to_string())

# 也可以将错误数据的行删除:
person = {
  "name": ['Google', 'Runoob' , 'Taobao'],
  "age": [50, 40, 12345]    # 12345 年龄数据是错误的
}
df10 = pd.DataFrame(person)
for x in df10.index:
    if df10.loc[x,'age']>120:
        df10.drop(x,inplace=True)
print(df10.to_string())


print("——"*50)



# Pandas 清洗重复数据
# 如果我们要清洗重复数据,可以使用 duplicated() 和 drop_duplicates() 方法。
# 如果对应的数据是重复的,duplicated() 会返回 True,否则返回 False。

person = {
  "name": ['Google', 'Runoob', 'Runoob', 'Taobao'],
  "age": [50, 40, 40, 23]
}
df11 = pd.DataFrame(person)
print(df11.duplicated())


print("——"*20)

# 删除重复数据,可以直接使用drop_duplicates() 方法。
person = {
  "name": ['Google', 'Runoob', 'Runoob', 'Taobao'],
  "age": [50, 40, 40, 23]
}
df11 = pd.DataFrame(person)
df11.drop_duplicates(inplace=True)
print(df11)

 

 

 

 

 

 

 

 

 

 

 

版权声明:本文为小酒馆里的清茶原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/xiaojiuguan/p/16212820.html