欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 产业 > python-pandas库

python-pandas库

2025/7/10 16:56:01 来源:https://blog.csdn.net/yogima/article/details/148451853  浏览:    关键词:python-pandas库

文章目录

  • 一、什么是pandas库?
  • 二、文件的读取和写入
  • 三、DataFrame
    • 1、DataFrame的构造
    • 2、DataFrame的方法
    • 3、数据合并
      • merge
      • concat
    • 4、数据清洗
      • dropna
      • fillna
      • drop_duplicates
      • 删去数据错误的行
    • 5、排序与聚合
      • 排序
      • 分组和聚合

一、什么是pandas库?

pandas是python的三方库,常用于对数据清洗、转换和分析。有两种重要的数据结构: Series(一维)和DataFrame(二维),通常使用DataFrame会多一些,因为表格的行和列正好是二维的。

通过pip install pandas安装pandas库并在python代码中引入:

import pandas as pd

二、文件的读取和写入

读取一般来说是使用pandas.read_xxx(),例如读取Excel:pd.read_excel(),读取csv:pd.read_csv(),读取json:pd.read_json()
写入一般是使用DataFrame.to_xxx(),写入Excel:DataFrame.to_excel(),写入csv:DataFrame.to_csv(),写入json:DataFrame.to_json()

在读取excel文件的示例:


df_example = pd.read_excel('/root/exp.xlsx', sheet_name=None, skiprows=range(1, 329000), nrows=450000 - 329000, usecols=['时间', '计划值', '表头示例2'])

这里面用到的参数:

参数名作用
sheet_name读取的工作表名称或索引。不指定则默认为0,即第一个工作表sheet_name=None代表读取所有sheet,读取多个表单:sheet_name=['Sheet1', 'Sheet2']
skiprows指定要跳过的行数或要跳过的行的列表,默认第0行是表头,skiprows=range(1, 329000)的意思就是跳过除了表头之外第一行到第329000的数据
header表头为第几行,不设置则默认为0,也就是第一行,如果把表头前的行数跳过,这里就不用设置
nrows指定要读取的总行数,不指定则读取所有行
usecols指定要读取的列名(可以是列名的列表,也可以是列索引的列表),不指定则默认读取所有列

注:
这里的skiprows、header、nrows和usecols,在读取read_csv()的时候也存在,但是read_csv()没有sheet_name参数,因为csv文件只存在一个sheet。

三、DataFrame

DataFrame是一个二维数组结构,像二、中读取文件的结果就是DataFrame。
DataFrame结构示例

1、DataFrame的构造

import pandas as pd# 方法一
# 用列表创建行
data = [['Google', 10], ['Runoob', 12], ['Wiki', 13]]
# 定义列名
df = pd.DataFrame(data, columns=['Site', 'Age'])# 方法二
# 直接用字典
data2 = {'Site':['Google', 'Runoob', 'Wiki'], 'Age':[10, 12, 13]}
df2 = pd.DataFrame(data2)# 可以使用astype方法设置每列的数据类型
df['Site'] = df['Site'].astype(str)
df['Age'] = df['Age'].astype(float)print(df.head())

在这里用方法一和方法二都可以构造出DataFrame,当然直接从文件中读取也是可以的:

df3 = pd.read_excel('/root/exp.xlsx')

2、DataFrame的方法

这里列几个常用方法:

方法作用
head(n)返回 DataFrame 的前 n 行数据(默认前 5 行)
tail(n)返回 DataFrame 的后 n 行数据(默认后 5 行)
columns返回 DataFrame 的所有列名,也可以通过df.columns = ['test1', 'test2']来重命名所有列名
dropna()删除含有缺失值(NaN)的行或列
loc[]返回某行/某几行数据,例如df.loc[0]返回第一行,df.loc[[0, 1]]返回第一第二行,也可以通过loc[0,"列名"]获取第一行某一列具体某个数据
apply(func)对 DataFrame应用一个函数
merge()按一个或多个键合并多个 DataFrame(类似 SQL 的 JOIN 操作)
concat()按行或按列连接多个 DataFrame
to_csv()将 DataFrame 导出为 CSV 文件
to_excel()将 DataFrame 导出为 Excel 文件
to_json()将 DataFrame 导出为 JSON 格式

数据过滤:

filtered_df = df[df['age'] > 30]

apply应用示例:

# 示例一
df['age'] = df['age'].apply(lambda x: 0 if x < 0 else x)# 示例二
df['age'] = df['age'].apply(lambda x: cal(x))
def cal(age):……

3、数据合并

一般数据合并使用merge和concat方法。

merge

merge用于基于一个或多个键将两个 DataFrame 连接在一起(通过某一列值来将两个表头拼接),merge操作示例:

import pandas as pdmerged_df = pd.merge(test_df1, test_df2, on='time', how='outer')

这里合并多个DataFrame,on代表根据time列合并,而how参数的取值:
inner:默认值,只保留两个DataFrame中time列同时存在的记录,即交集部分;
outer:保留两个DataFrame中time列的所有记录,即并集部分。如果一方没有对应记录,则合并后的DataFrame中相应位置会填充为NaN
left:以左DataFrame为基础,保留test_df1time列的所有记录,并合并test_df2time列存在的记录。如果test_df2中没有对应记录,则合并后的DataFrame中相应位置会填充为NaN
right:以右DataFrame为基础,保留test_df2time列的所有记录,并合并test_df1time列存在的记录。如果test_df1中没有对应记录,则合并后的DataFrame中相应位置会填充为NaN

concat

concat更多用于表头相同的情况下行数据的拼接,因为如果是和merge一样拼列的话,虽然也可以通过join参数指定inner和outer,但是它的拼接逻辑是根据索引去拼接,而不是某一列。

# 行数据的拼接
result_outer = pd.concat([df1, df2], axis=0, ignore_index=True)
# 列数据的拼接
result_axis1 = pd.concat([df1, df2], axis=1, join='outer')

axis:=0:行数据拼接;=1:列数据拼接;
ignore_index:默认为False,为True时忽略原始索引,重新生成索引
join:默认为outer,为outer时按索引拼接所有记录,如果某个表头不存在则NaN,为inner时只保留索引并集的记录。实际上在尝试时发现当axis=0,也就是拼接行数据的时候,join似乎是不生效的,就算设置为inner,也会将两个df中的数据进行拼接操作。

4、数据清洗

dropna

使用dropna删除包含空数据的行:

df = pd.read_csv('property-data.csv')
new_df = df.dropna()

dropna()默认返回新的DataFrame,如果需要直接修改源数据DataFrame,需要使用df.dropna(inplace = True)
除了inplace之外其他dropna可选的参数:

参数说明
axis默认为 0,表示逢空值剔除整行,如果设置参数 axis=1 表示逢空值去掉整列。
how默认为 ‘any’ 如果一行(或一列)里任何一个数据有出现 NA 就去掉整行,如果设置 how=‘all’ 一行(或列)都是 NA 才去掉这整行。
thresh除去本行/列中为NA值的格子数量后,剩余有值的格子数量小于thresh的值则该行/列被删除
subset设置想要检查的列。如果是多个列,可以使用列名的 list 作为参数。

指定列:df.dropna(subset=['ST_NUM'], inplace = True)

python默认会把n/a 和 NA当成空数据,我们也可以在读取时使用na_values自己定义:

missing_values = ["n/a", "na", "--"]
df = pd.read_csv('property-data.csv', na_values = missing_values)
print (df['TEST_1'].isnull())# isnull()返回一个布尔类型的列表

fillna

使用fillna填补空数据:

df["ST_NUM"].fillna(df["ST_NUM"].mean(), inplace = True)

.mean() 平均数 median() 中位数 mode() 众数

drop_duplicates

使用drop_duplicates删除重复数据:

DataFrame.drop_duplicates(subset=None, keep='first', inplace=False)

subset 参数用于指定需要考虑的列,默认为 None,表示考虑所有列。
keep 参数用于指定在去除重复项时保留哪一项。默认为 ‘first’,表示保留第一次出现的项。如果设置为 ‘last’,则保留最后一次出现的项。如果设置为 False,则所有重复项都会被去除。
inplace 参数用于指定是否在原数据集上进行操作。默认为 False,表示返回一个新的数据集。如果设置为 True,则在原数据集上进行操作,并返回 None。

删去数据错误的行

示例:

for x in df.index:if df.loc[x, "age"] > 120:df.drop(x, inplace = True)

5、排序与聚合

排序

sort_values()用于按值排序,ascending默认为True,升序排序;
sort_index()用于按索引排序,axis 控制按行或列排序。

# 按照 "Age" 列的值进行降序排序
df_sorted = df.sort_values(by='Age', ascending=False)
# 按照行索引进行排序
df_sorted_by_index = df.sort_index(axis=0)

分组和聚合

df.groupby(by).agg()
groupby():按某些列分组。
agg(): 传入不同的聚合函数,如 sum(), mean(), count(), min(), max(), std() 等。

import pandas as pd# 示例数据
data = {'Department': ['HR', 'Finance', 'HR', 'IT', 'IT'],'Employee': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],'Salary': [50000, 60000, 55000, 70000, 75000]}df = pd.DataFrame(data)# 按照部门分组,并计算每个部门的平均薪资
grouped = df.groupby('Department')['Salary'].mean()
# df.groupby('Department').agg({'Salary': 'mean'})
# 按照部门分组,并计算每个部门的薪资的平均值和总和
grouped_multiple = df.groupby('Department').agg({'Salary': ['mean', 'sum']})
print(grouped)

分组后排序:先分组,再组内排序。

# 按照部门分组后,按薪资降序排序
grouped_sorted = df.groupby('Department').apply(lambda x: x.sort_values(by='Salary', ascending=False))
print(grouped_sorted)

结果:

Department Employee Salary
Department
Finance Bob 60000
HR Charlie 55000
HR Alice 50000
IT Eve 75000
IT David 70000

其实还有透视表,但是后面有机会再写吧,先到这里…

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词