文章目录
- 📚相关函数
- 🐇数据读取和写入:read_csv和to_csv
- 🐇数据过滤:pandas.DataFrame.loc
- 🐇抽样:pandas.DataFrame.sample
- 🐇删除缺失数据:dropha
- 🐇添加元素:append
- 🐇groupby和匿名函数
- 📚案例
python基础 | Pandas基础
📚相关函数
🐇数据读取和写入:read_csv和to_csv
pandas系列 read_csv 与 to_csv 方法各参数详解(全,中文版)
Pandas–read_csv,to_csv参数说明
read_csv
:把CSV文件读取为一个DataFrame对象filepath_or_buffer
:要读取的CSV文件的路径或文件对象。sep
:指定用于分隔字段的字符,默认为逗号(,)。header
:指定作为列名的行号,默认为0,表示第一行。index_col
:指定作为索引的列号或列名,默认为None,即不使用任何列作为索引。na_values
:指定在CSV文件中应被解释为缺失值的值。dtype
:指定每列的数据类型,可以使用字典来分别指定每列的数据类型。nrows
:指定读取的行数。skiprows
:指定跳过的行数。encoding
:指定文件编码。
to_csv
:将DataFrame对象写入到CSV文件中path_or_buf
:要写入的CSV文件的路径或文件对象。sep
:指定用于分隔字段的字符,默认为逗号(,)。header
:指定是否包含列名,默认为True。index
:指定是否包含行索引,默认为True。mode
:指定写入模式,默认为’w’,覆盖已存在的文件;若设为’a’,则追加数据到已存在的文件。encoding
:指定文件编码。
🐇数据过滤:pandas.DataFrame.loc
Pandas.DataFrame.loc函数用法大全
DataFrame.loc[row_indexer, column_indexer]
:其中 row_indexer和 column_indexer可以是单个标签、标签列表、标签切片、布尔数组或可返回这些对象之一的可调用函数。
- 通过标签选择特定行和列
# 选择行为'Alice',列为'Age'和'City' df.loc['Alice', ['Age', 'City']]# 选择标签为'Alice'到'Charlie'的行,所有列 df.loc['Alice':'Charlie', :]# 选择标签为'Alice'到'Charlie'的行,列为'Age'到'City' df.loc['Alice':'Charlie', 'Age':'City']
- 使用布尔条件选择行和列
# 选择年龄大于等于30的行,所有列 df.loc[df['Age'] >= 30, :]# 选择年龄大于等于30的行,列为'Name'和'Age' df.loc[df['Age'] >= 30, ['Name', 'Age']]
- 使用可调用函数选择行和列
# 定义一个函数,选择名字长度大于5的行,所有列 def name_length(row):return len(row['Name']) > 5df.loc[name_length, :]
🐇抽样:pandas.DataFrame.sample
【很详细的一篇博客!】Pandas数据清洗系列:DataFrame.sample方法详解
DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)
n
:要抽样的行数。frac
:要抽样的行百分比。replace
:是否允许重复抽样,默认为False。weights
:每行的抽样权重,可以是一个列名或值的Series。random_state
:用于确定随机种子的整数或RandomState对象,以确保可重复的随机抽样。axis
:0表示抽样行,1表示抽样列。
# 从DataFrame中随机选择3行
df.sample(n=3)# 从DataFrame中随机选择20%的行
df.sample(frac=0.2)# 从DataFrame中选取3行,并允许重复抽样
df.sample(n=3, replace=True)# 为每行设置不同的抽样权重,并从DataFrame中随机选择1行
weights = pd.Series([0.1, 0.3, 0.6], index=df.index)
df.sample(n=1, weights=weights)
🐇删除缺失数据:dropha
Pandas删除缺失数据函数–dropna
DataFrame.dropna(axis=0, how='any', inplace=False)
-
axis
:指定删除的轴,axis=0表示删除包含缺失值的行(默认),axis=1表示删除包含缺失值的列。 -
how
:指定删除的条件,默认为’any’,表示如果有任何一个元素为空,则删除该行或列;如果设置为’all’,则要求整行或整列都为空时才删除。 inplace
:指定是否在原地更改DataFrame,默认为 False,表示创建一个新的DataFrame返回,不影响原始DataFrame。
🐇添加元素:append
Python 列表 append()函数使用详解
DataFrame.append(other, ignore_index=False, verify_integrity=False)
other
:要追加的对象,可以是DataFrame、Series、字典(由Series组成)等。ignore_index
:是否忽略索引,默认为 False。如果设置为 True,则添加行时会生成新的连续整数索引。verify_integrity
:是否验证DataFrame中的索引,并引发异常,默认为 False。如果设置为 True,并且追加操作会导致索引冲突,则会引发异常。
🐇groupby和匿名函数
python——当groupby遇到匿名函数
DataFrame.groupby(by=None, axis=0, level=None, as_index=True)
by
:指定用于分组的列或多个列,可以是列名、列标签列表或字典等。axis
:指定分组的轴,默认为0,表示按行进行分组;设置为1则按列进行分组。level
:对于具有多层级索引的数据,通过指定 level可以按指定层级的索引进行分组,默认为 None。as_index
:指定是否将分组的列作为新索引,默认为 True,即将分组的列作为索引;设置为 False则不进行该操作。
grouped_data = df.groupby('category')['price'].apply(lambda x: x.mean())
- 首先使用 groupby(‘category’)对DataFrame df 按’category’列进行分组。
- 对分组后的每个组使用 apply()函数,将匿名函数应用于’price’列上。
- 用匿名函数 lambda x: x.mean()计算每个组中’price’列的均值。
- 最终,得到一个包含每个分类的平均价格的Series对象。
-
reset_index(drop=True, inplace=True)
是对DataFrame对象进行操作的一个方法。它的主要作用是重置索引并将索引设置为连续的整数,并可选择是否在原地更改DataFrame。 -
由于某些操作(例如分组、筛选、采样等)可能会导致DataFrame的索引出现乱序或不连续的情况,reset_index()可以帮助我们重新构建索引,确保其按照连续的整数值排列。
-
假设有以下DataFrame
index A B 0 0 1 4.0 1 2 2 5.0 2 3 3 6.0
-
执行后为
A B 0 1 4.0 1 2 5.0 2 3 6.0
📚案例
- 过滤条件为:
from_level = “一般节点”
traffic !=0
-
加权采样:to_level的值为一般节点与网络核心的权重之比为 1 : 5
-
分层采样:根据to_level的值进行分层采样
-
随机采样,以上各采样50条
import pandas as pd# 读取数据集 data = pd.read_csv('test.csv')# 删除空行(所有列均为空) data.dropna(how='all', inplace=True)# 数据过滤,只保留了'from_level'列值为"一般节点"且'traffic'列值不等于0的行 filtered_df = data.loc[(data['from_level'] == "一般节点") & (data['traffic'] != 0)] filtered_df.to_csv('filtered_data.csv', index=False, encoding='utf-8')# 加权采样,一般节点被赋予1的权重,网络核心被赋予5的权重 weighted_ratios = {'一般节点': 1, '网络核心': 5} sample_data = pd.DataFrame() for level, ratio in weighted_ratios.items():level_data = data[data['to_level'] == level]level_sample = level_data.sample(int(50 * ratio / sum(weighted_ratios.values())), random_state=42)sample_data = sample_data.append(level_sample) sample_data.to_csv('weighted_sample.csv', index=False, encoding='utf-8')# 分层采样,采样数量根据每个分组的数量与整个数据集的比例计算得出 stratified_sample = data.groupby('to_level').apply(lambda x: x.sample(n=round(50*len(x)/len(data)), replace=False, random_state=42)) stratified_sample.reset_index(drop=True, inplace=True) stratified_sample.to_csv('stratified_sample.csv', index=False, encoding='utf-8')# 随机采样 random_sample = data.sample(n=50, replace=False, random_state=42) random_sample.to_csv('random_sample.csv', index=False, encoding='utf-8')