数据分析 02 Pandas基础

这篇博客介绍了Pandas的基础知识,包括DataFrame和Series数据类型。通过一系列任务,如加载CSV文件、查看数据列、筛选数据等,展示了如何操作和筛选Pandas数据。讨论了loc和iloc的区别,并提供了实战例子,如显示特定年龄范围内的乘客信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2 Pandas基础

我们学习pandas的基础操作,那么上一节通过pandas加载之后的数据,其数据类型是什么呢?
Pandas中有两个数据类型DataFrameSeries

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

DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。
DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共同用一个索引)。
2.1 任务一:pandas中有两个数据类型DateFrame和Series,通过查找简单了解他们。然后自己写一个关于这两个数据类型的小例子🌰[开放题]

import pandas as pd
example1_data = {'ABC': 35000, 'EFG': 71000, 'IJK': 16000, 'LMN': 5000}
example_1 = pd.Series(example1_data)
print(example_1)
print(type(example_1))
# ABC    35000
# EFG    71000
# IJK    16000
# LMN     5000
# dtype: int64
# <class 'pandas.core.series.Series'>
example2_data = {'name': ['ABC', 'EFG', 'HIJ', 'KLM', 'NLL', 'PKK'],
        'year': [2000, 2001, 2002, 2001, 2002, 2003],'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
example_2 = pd.DataFrame(example2_data)
print(example_2)
print(type(example_2))
#   name  year  pop
# 0  ABC  2000  1.5
# 1  EFG  2001  1.7
# 2  HIJ  2002  3.6
# 3  KLM  2001  2.4
# 4  NLL  2002  2.9
# 5  PKK  2003  3.2
# <class 'pandas.core.frame.DataFrame'>

2.2 任务二:根据上节课的方法载入"train.csv"文件

'''载入"train.csv"文件'''
df1 = pd.read_csv("train.csv")

2.3 任务三:查看DataFrame数据的每列的项

'''查看DataFrame数据的每列的项'''
print(df1.columns)
# Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
#        'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
#       dtype='object')

2.4任务四:查看"cabin"这列的所有项 [有多种方法]

'''查看"cabin"这列的所有项'''
print(df1['Cabin'].head(3))
# 0    NaN
# 1    C85
# 2    NaN
# Name: Cabin, dtype: object
print(df1.Cabin.head(3))
# 0    NaN
# 1    C85
# 2    NaN
# Name: Cabin, dtype: object

2.5 任务五:加载文件"test_1.csv",然后对比"train.csv",看看有哪些多出的列,然后将多出的列删除
经过我们的观察发现一个测试集test_1.csv有一列是多余的,我们需要将这个多余的列删去
【思考】还有其他的删除多余的列的方式吗?

del df[]
df.drop([],axis = 1)

# 例如
df.drop(['性别', '票价'],axis=1, inplace=True)  # 删除多列
# inplace 是起了一个保存作用,如果没有它,就只是隐藏了列元而已

2.6 任务六: 将[‘PassengerId’,‘Name’,‘Age’,‘Ticket’]这几个列元素隐藏,只观察其他几个列元素

'''将['PassengerId',XXXXXX]这几个列元素隐藏,只观察其他几个列元素'''
print(df1.drop(['PassengerId', 'Survived', 'Pclass'],axis=1).head(3))
#                                                 Name     Sex  ...  Cabin  Embarked
# 0                            Braund, Mr. Owen Harris    male  ...    NaN         S
# 1  Cumings, Mrs. John Bradley (Florence Briggs Th...  female  ...    C85         C
# 2                             Heikkinen, Miss. Laina  female  ...    NaN         S
#
# [3 rows x 9 columns]

print(df1.head(3))
#    PassengerId  Survived  Pclass  ...     Fare Cabin  Embarked
# 0            1         0       3  ...   7.2500   NaN         S
# 1            2         1       1  ...  71.2833   C85         C
# 2            3         1       3  ...   7.9250   NaN         S
#
# [3 rows x 12 columns]

【思考】对比任务五和任务六,是不是使用了不一样的方法(函数),如果使用一样的函数如何完成上面的不同的要求呢?
【思考回答】
如果想要完全的删除你的数据结构,使用inplace=True,因为使用inplace就将原数据覆盖了,所以这里没有用

筛选的逻辑
表格数据中,最重要的一个功能就是要具有可筛选的能力,选出我所需要的信息,丢弃无用的信息。
下面我们还是用实战来学习pandas这个功能。
2.7 任务一: 我们以"Age"为筛选条件,显示年龄在10岁以下的乘客信息。
2.8 任务二: 以"Age"为条件,将年龄在10岁以上和50岁以下的乘客信息显示出来,并将这个数据命名为midage

'''我们以"Age"为筛选条件,显示年龄在10岁以下的乘客信息。'''
print(df1[df1["Age"]<10].head(3))
#     PassengerId  Survived  Pclass  ...    Fare Cabin  Embarked
# 7             8         0       3  ...  21.075   NaN         S
# 10           11         1       3  ...  16.700    G6         S
# 16           17         0       3  ...  29.125   NaN         Q
#
# [3 rows x 12 columns]

'''以"Age"为条件,将年龄在10岁以上和50岁以下的乘客信息显示出来,并将这个数据命名为midage'''
midage = df1[(df1["Age"]>10)& (df1["Age"]<50)]
print(midage.head(3))
#    PassengerId  Survived  Pclass  ...     Fare Cabin  Embarked
# 0            1         0       3  ...   7.2500   NaN         S
# 1            2         1       1  ...  71.2833   C85         C
# 2            3         1       3  ...   7.9250   NaN         S
#
# [3 rows x 12 columns]

【提示】了解pandas的条件筛选方式以及如何使用交集和并集操作

midage = df[(df["年龄"] > 50) | (df["年龄"] < 20)]  # 并集
midage = df[(df["年龄"] > 50) & (df["年龄"] < 20)]  # 交集

**2.9 任务三:将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来

print(midage.loc[[100],['Pclass','Sex']])
#      Pclass     Sex
# 100       3  female
midage = midage.reset_index()
print(midage.head(3))
#    index  PassengerId  Survived  ...     Fare Cabin Embarked
# 0      0            1         0  ...   7.2500   NaN        S
# 1      1            2         1  ...  71.2833   C85        C
# 2      2            3         1  ...   7.9250   NaN        S
# 
# [3 rows x 13 columns]
'''将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来'''
midage = midage.reset_index(drop=True)
print(midage.head(3))
#    PassengerId  Survived  Pclass  ...     Fare Cabin  Embarked
# 0            1         0       3  ...   7.2500   NaN         S
# 1            2         1       1  ...  71.2833   C85         C
# 2            3         1       3  ...   7.9250   NaN         S
#
# [3 rows x 12 columns]

print(midage.loc[[100],['Pclass','Sex']])
# [3 rows x 12 columns]
#      Pclass   Sex
# 100       2  male

【思考】这个reset_index()函数的作用是什么?如果不用这个函数,下面的任务会出现什么情况?**
如果想要按索引筛选,需要重置索引
当你想取特定行特定列的元素时,你或许需要将之前设定的“乘客id”索引给删去,这样才能完成特定行的获取。

midage = midage.reset_index(drop=True)
'''
reset_index():
函数原型:DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')
参数解释:
	- level:int、str、tuple或list,默认无,仅从索引中删除给定级别。默认情况下移除所有级别。
	- drop:drop为False则索引列会被还原为普通列,否则会丢失
	- inplace:默认为false,适当修改DataFrame(不要创建新对象)
	- col_level:int或str,默认值为0,如果列有多个级别,则确定将标签插入到哪个级别。默认情况下,它将插入到第一级。
	- col_fill:对象,默认‘’,如果列有多个级别,则确定其他级别的命名方式。如果没有,则重复索引名
'''

2.10 任务四:将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
【提示】使用pandas提出的简单方式,你可以看看loc方法
对比整体的数据位置,你有发现什么问题吗?那么如何解决?

2.11 任务五:使用iloc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来**

'''使用loc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来'''
print(midage.loc[[100, 105, 108], ['Pclass', 'Name', 'Sex']])
#      Pclass                               Name   Sex
# 100       2  Byles, Rev. Thomas Roussel Davids  male
# 105       3           Cribb, Mr. John Hatfield  male
# 108       3                    Calic, Mr. Jovo  male
print(midage.iloc[[100, 105, 108], [2, 3, 4]])  # iloc不能直接通过列名获取数值,而是要写出第几列
#      Survived  Pclass                               Name
# 100         0       2  Byles, Rev. Thomas Roussel Davids
# 105         0       3           Cribb, Mr. John Hatfield
# 108         0       3                    Calic, Mr. Jovo

总结:loc和iloc的区别:
loc:只能通过选取行标签索引数据;
iloc:只能通过选取行位置编号索引数据

[1]https://www.cnblogs.com/recoverableTi/p/13526941.html
[2]https://blog.youkuaiyun.com/weixin_41903171/article/details/108053159
[3]https://nbviewer.jupyter.org/github/andongBlue/hands-on-data-analysis/blob/master/%E7%AC%AC%E4%B8%80%E5%8D%95%E5%85%83%E9%A1%B9%E7%9B%AE%E9%9B%86%E5%90%88/%E7%AC%AC%E4%B8%80%E7%AB%A0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E8%8A%82pandas%E5%9F%BA%E7%A1%80.ipynb
[4]https://nbviewer.jupyter.org/github/andongBlue/hands-on-data-analysis/blob/master/%E7%AC%AC%E4%B8%80%E5%8D%95%E5%85%83%E9%A1%B9%E7%9B%AE%E9%9B%86%E5%90%88/%E7%AC%AC%E4%B8%80%E7%AB%A0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E8%8A%82pandas%E5%9F%BA%E7%A1%80-%E8%AF%BE%E7%A8%8B.ipynb#1.4.4任务四:查看%22cabin%22这列的所有项-[有多种方法]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值