基础Python教程之pandas使用总结

Pandas 简介

Pandas 库是机器学习四个基础库之一, 它有着强大的数据分析能力和处理工具。它支持数据增、删、改、查;支持时间序列分析功能;支持灵活处理缺失数据;具有丰富的数据处理函数;具有快速、灵活、富有表现力的数据结构:DataFrame 数据框和 Series 系列。

官方文档:API reference — pandas 2.1.1 documentation

Pandas 读取与存储数据

1、csv文件读取

read_csv(filepath_or_buffer, sep=',', header='infer', names=None, index_col=None, dtype=None, engine=None, nrows=None)

参数名称说明
filepath接收 string。代表文件路径。无默认。
sep接收 string。代表分隔符。read_csv 默认为' , ',read_table 默认为制表符 '[Tab]'。
header接收 int 或 sequence。表示将某行数据作为列名。默认为 infer,表示自动识别。
names接收 array。表示列名。默认为 None。
index_col接收 int、sequence 或 False。表示索引列的位置,取值为 sequence 则代表多重索引。默认为 None。
dtype接收 dict。代表写入的数据类型(key:列名,values:数据格式)。默认为 None。
engine接收 C 或者 Python。代表数据解析引擎。默认为 C。
  • sep 参数是指定文本的分隔符,如果分隔符指定错误,在读取数据的时候,每一行数据将连城一片。
  • header 参数是用来指定列名,如果是 None 则会添加一个默认的列名。
  • encoding 代表文件的编码格式,常用的编码有 utf-8、utf-16、gbk、gb18030、big5 等。如果编码指定错误,数据将无法读取,Ipython 解释器会报解析错误。
import numpy as np
import pandas as pd

df = []

df = pd.read_csv(file, dtype='str')  # 所有数据转为字符串
df = df.replace(np.nan, '')  # 空数据转为空字符串

print(df)

2、excel文件读取

pandas.read_excel(io, sheetname=0, header=0, index_col=None, names=None, dtype=None)

参数名称说明
io接收 string。代表文件路径。无默认。
sheet_name接收 string 或 int。代表 excel 表内数据的分表位置。默认为0。
header接收 int 或 sequence。表示将某行数据作为列名。默认为 infer,表示自动识别。
names接收 int、sequence 或 False。表示索引列的位置,取值为 sequence 则代表多重索引。默认为 None。
index_col接收 int、sequence 或 False。表示索引列的位置,取值为 sequence 则代表多重索引。默认为 None。
dtype接收 dict。代表写入的数据类型(列名为 key,数据格式为 values)。默认为 None。
import pandas as pd
import numpy as np

df = []

ws = pd.ExcelFile(file)
sheets = ws.sheet_names
print(sheets)
for sheet in sheets:
    tem_df = pd.read_excel(file, sheet_name=sheet, dtype='str')
    tem_df = tem_df.replace(np.nan, '')

    if len(df) == 0:
        df = tem_df
    else:
        df = pd.concat([df, tem_df])

print(df)

3、储存数据

dict数据存储

result = {
 'A': [1.0,2.2,3,4], 
 'B': [7,8,9,0], 
 'C': [1,2,3,4], 
 'D': [3,5,7,9]
}


df = pd.DataFrame.from_dict(result)

# 输出csv
df.to_csv(out_file_csv, index=False)
# 输出excel
df.to_excel(out_file_excel, index=False)

多维数据存储

result = [[1.0,2.2,3,4],[1,2,3,4],[7,8,9,0],[3,5,7,9]]
columns_result = ['A', 'B', 'C', 'D']


df = pd.DataFrame(result, columns=columns_result)

# 输出csv
df.to_csv(out_file_csv, index=False)
# 输出excel
df.to_excel(out_file_excel, index=False)

excel存储限制,单sheet页只能存100万条数据

    result = [[1.0,2.2,3,4],[1,2,3,4],[7,8,9,0],[3,5,7,9]]
    columns_result = ['A', 'B', 'C', 'D']
    
    # 输出excel
    writer = pd.ExcelWriter(out_file)
    result_df = pd.DataFrame(result, columns=columns_result)
    page_size = 500000
    page_num = math.ceil(len(result_df) / page_size)
    for i in range(page_num):
        s_idx = i * page_size
        e_idx = (i + 1) * page_size if (i + 1) * page_size < len(result_df) else len(result_df)
        tmp_df = result_df[s_idx:e_idx]
        tmp_df.to_excel(writer, sheet_name="Sheet{}".format(i + 1), index=False)
    writer._save()

Pandas增删改查操作

1、访问数据框中的元素

  • 对某一列的某几行访问:访问 DataFrame 中的某一列的某几行时,单独一列的 DataFrame 可以视为一个 Series,而访问一个 Series 和访问一个一维的 ndarray 基本相同。
  • 对多列数据访问:访问 DataFrame 多列数据可以将多个列索引名称视为一个列表,同时访问 DataFrame 多列数据中的多行数据和访问单列数据的多行数据方法基本相同。
  • 对某几行访问:head 和 tail 函数可以得到多行数据,但是用这两种方法得到的数据都是从开始或末尾获取的连续数据。默认参数为访问五行。
import pandas as pd 

d = [[1.0,2.2,3,4],[1,2,3,4],[7,8,9,0],[3,5,7,9]]
df = pd.DataFrame(d, columns=['A', 'B', 'C', 'D'])
print(df)

print(df['A'])                       # 单列数据访问
print(df[['A', 'C']])                # 多列数据访问

print(df.head(3))                    # 访问前三行数据
print(df.tail(3))                    # 访问后三行数据

print(df[0:4])                    # 访问前三行数据
print(df[:-4])                    # 访问后三行数据

loc、iloc 方法

DataFrame.loc[行索引名称,列索引名称],如果传入的不是索引名称,那么切片操作将无法执行。

DataFrame.iloc[行索引位置,列索引位置],如果传入的不是索引位置,那么切片操作将无法执行。

loc 方法的代码灵活多变,代码的可读性更高;iloc 方法的代码简洁,但可读性不高。

使用 loc、iloc 方法访问查看 DataFrame 中的数据:

  • 使用 loc、iloc 方法实现多列切片,其原理是将多列的列名或者位置作为一个列表或者数据传入。
  • 使用 loc、iloc 方法可以取出 DataFrame 中的任意数据。
  • 在使用 loc 方法的时候内部传入的行索引名称如果为一个区间,则前后均为闭区间。其内部还可以传入表达式,结果会返回满足表达式的所有值。
  • 在使用 loc 方法的时候内部传入的行索引位置或列索引位置为区间时,则为前闭后开区间。
  • 使用 loc 方法能够实现所有单层索引切片操作。

# 按照行列顺序进行数据访问
print(df.iloc[0, 0])                 # 取出第一行第一列的数据
print(df.iloc[0:3, 0])               # 取出前三行第一列的数据
print(df.iloc[:, 0])                 # 取出第一列的数据
print(df.iloc[0, :])                 # 取出第一行的数据
print(df.iloc[1:3, 1:3])

# 按照行列名称进行数据访问
print(df.loc['a', 'A'])               # a行,A列
print(df.loc['a':'c', 'A'])           # a到c行,A列
print(df.loc[:, 'A'])                 # 访问第A列的元素
print(df.loc['a', :])                 # 访问第a行的元素
print(df.loc[['b','c'], ['B', 'C']])

# 注意如下方式返回值的区别
print(df.iloc[:, 0])                  # 返回的是 Series
print(df.iloc[:, 0:1])                # 返回的是 DataFrame

print(type(df.iloc[:, 0])) 
print(type(df.iloc[:, 0:1]))
df.iloc[:, 0:1]

循环查询,使用 iterrows() 方法循环遍历行

import pandas as pd

# 创建数据帧
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})

# 使用 iterrows() 方法遍历行
for index, row in df.iterrows():
    print(index, row['A'], row['B'])

2、修改数据框中的元素

更改 DataFrame 中的数据,原理是将这部分数据提取出来,重新赋值为新的数据。需要注意的是,数据更改直接针对 DataFrame 原数据更改,操作无法撤销。所以在做出更改前最好对数据进行备份。

DataFrame.loc[行索引名称,行索引名称] = new_value

d = [[1.0,2.2,3,4],[1,2,3,4],[7,8,9,0],[3,5,7,9]]
df = pd.DataFrame(d, columns=['A', 'B', 'C', 'D'])
print(df)
df.loc['a', 'A'] = 101          # 对某个元素进行修改
df.loc[:, 'B'] = 0.25           # 对某一列进行修改
df.loc[:, 'C'] = [1, 2, 3, 4]   # 将某一列元素改成不同的值
print(df)

3、删除数据框中的元素

使用 drop 方法删除 Series 的元素或 DataFrame 的某一行(列)。

DataFrame.drop(labels=None, axis=0, levels=None, inplace=False)

参数名称说明
labels接收 string 或 array。代表删除的行或列的标签。无默认。
axis接收0或1。代表操作的轴向。默认为0。
levels接收 int 或者索引名。代表标签所在级别。默认为 None。
inplace接收 boolean。代表操作是否对原数据生效。默认为 False。

d = [[1.0,2.2,3,4],[1,2,3,4],[7,8,9,0],[3,5,7,9]]
df = pd.DataFrame(d, index=['a', 'b', 'c', 'd'], columns=['A', 'B', 'C', 'D'])
print(df)
print(df.drop('D', axis=1, inplace=False))    # 删除数据框的列元素
print(df.drop(['a', 'c'], axis=0))            # 删除数据框的行元素

Pandas转换与处理时间序列数据

1、将字符串转换为日期类型

# 将各种日期字符串转换成日期格式
import pandas as pd
data = ['12Feb23', '20201225', '2022/12/25', '2018.7.12']
columns = ['日期']
df = pd.DataFrame(data = data, columns = columns)
df['转换后'] = pd.to_datetime(df['日期'])
print(df)

2、日期类型转时间戳

import pandas as pd

data = {'date': ['2022-10-29', '2022-10-30', '2022-10-31'], 'value': [1, 2, 3]}
df = pd.DataFrame(data)

# 先将日期列转换成datetime格式
df['date'] = pd.to_datetime(df['date'])

# 再将datetime格式转换成timestamp
df['timestamp'] = df['date'].apply(lambda x: int(x.timestamp()))

print(df)

3、使用dt对象获取datetime数据类型的特定信息

# dt 对象的使用
import pandas as pd
df = pd.read_excel('datetime.xlsx')
df['日期'] = pd.to_datetime(df['原日期'])
df['年'] = df['日期'].dt.year
df['月'] = df['日期'].dt.month
df['日'] = df['日期'].dt.day
df['星期几'] = df['日期'].dt.day_name()
df['是否年底'] = df['日期'].dt.is_year_end

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

番茄小能手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值