背景图
Python拾遗 —— Pandas库

2024年04月24日 作者头像 作者头像 ArnoX 编辑

pandas_header.png

Pandas库主要引入了两种新的数据结构:SeriesDataFrame 。其中 Series 类似于一维数组,DataFrame类似于二维表格,可以看作是由多个 Series 按列排列构成的表格,既有行索引也有列索引,因此可以方便地进行行列选择、过滤、合并等操作。

pandas.png


1. Series

pd.Series() 构造函数创建 Series 对象,传递一个数据数组(可以是列表、NumPy 数组等)和一个可选的索引数组。

pd.Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath=False)
#data:Series 的数据部分,可以是列表、数组、字典、标量值等。
#index:Series 的索引部分,用于对数据进行标记。可以是列表、数组、索引对象等。默认整数
#dtype:指定 Series 的数据类型。可以是 NumPy 的数据类型,例如 np.int64、np.float64 等。如果不提供此参数,则根据数据自动推断数据类型。

*这里补充一点dtype的相关知识:
数据类型对象 (dtype):是 NumPy 中的一个概念,它描述了如何解释数组中每个元素对应的内存块的字节。描述数据的类型(整数、浮点数、Python 对象等)、数据的大小(例如整数占用多少字节)、数据的字节顺序(小端序或大端序)、如果数据类型是结构化数据类型(structured data type),即由其他数据类型组成的聚合类型(例如,描述由整数和浮点数组成的数组项),则结构的“字段”名称、每个字段的数据类型以及每个字段在内存块中的位置。

基础操作:

# 指定索引创建 Series
s = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])

# 获取值
value = series[2]  # 获取索引为2的值
print(s['a'])  # 返回索引标签 'a' 对应的元素

# 获取多个值
subset = series[1:4]  # 获取索引为1到3的值

# 使用自定义索引
value = series_with_index['b']  # 获取索引为'b'的值

# 索引和值的对应关系
for index, value in series_with_index.items():
    print(f"Index: {index}, Value: {value}")

# 使用切片语法来访问 Series 的一部分
print(s['a':'c'])  # 返回索引标签 'a' 到 'c' 之间的元素
print(s[:3])  # 返回前三个元素

2. DataFrame

pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
#data可为字典、二维数组、Series等。
#index,行索引,可为列表、数组、索引对象等。
#columns,列索引
  • 使用列表创建
import pandas as pd

data = [['Google', 10], ['Baidu', 12], ['Wiki', 13]]

# 创建DataFrame
df = pd.DataFrame(data, columns=['Site', 'Age'])

# 使用astype方法设置每列的数据类型
df['Site'] = df['Site'].astype(str)
df['Age'] = df['Age'].astype(int)

print(df)

输出结果:

   Site  Age
0  Google   10
1   Baidu   12
2    Wiki   13
  • 使用字典创建:
import pandas as pd
data = {'Site':['Google', 'Baidu', 'Wiki'], 'Age':[10, 12, 13]}
df = pd.DataFrame(data)

print (df)

Pandas 可以使用 loc 属性返回指定行的数据,如果没有设置索引,第一行索引为 0,第二行索引为 1,以此类推:

import pandas as pd

data = {
  "calories": [400, 360, 370],
  "duration": [50, 40, 45]
}

# 载入到 DataFrame 对象
df = pd.DataFrame(data)

# 返回第一行
print(df.loc[0])
# 返回第二行
print(df.loc[1])

输出结果:

calories    420
duration     50
Name: 0, dtype: int64
calories    380
duration     40
Name: 1, dtype: int64

注:返回结果其实就是 Series 数据


3. 处理CSV文件

csv读取

import pandas as pd

df = pd.read_csv('nba.csv')#读取CSV

print(df.to_string())#使用to_string()函数返回DataFrame 类型的数据,如果不使用该函数,则输出结果为数据的前面5行和末尾5行,中间部分以...代替。
df_head=df.head(n)# 读取前n行数据,默认返回5行
df_tail=df.tail(n)# 读取尾部n行,空行返回NaN
sw_info=sf.info()# 返回基本信息(行数、列数、各列数据类型)

*用Pandas读取文件十分方便,其自带的read_csv,read_json或者是read_sql函数也很好用,引申一个在目标路径已知的情况下遍历读所有.txt文件的案列:

file_dir = "D:\\metric-traffic\\traffic\\"
list_file=glob.glob(file_dir+"*.txt")
for i in range(len(list_file)):
    df=pd.read_csv(list_file[i])
    print(df)

csv写入

import pandas as pd

name = ["Google", "Baidu", "Taobao", "Wiki"]
site = ["www.google.com", "www.Baidu.com", "www.taobao.com", "www.wikipedia.org"]
age = [90, 40, 80, 98]

# 字典
dict = {'name': name, 'site': site, 'age': age}
 
df = pd.DataFrame(dict)

# 写入csv
df.to_csv('site.csv')

4. 数据清洗

常用函数:

df.dropna() # 删除包含缺失值的行或列
df.fillna(0) # 将缺失值替换为指定的值
df.replace('old_value', 'new_value')# 将指定值替换为新值
df.duplicated()# 检查是否有重复的数据
df.drop_duplicates()# 删除重复的数据