Pandas数据分析 ——Task01:Pandas基础

教程地址:joyful-pandas/第1章 Pandas基础——datawhalechina

准备工作:Pandas包的下载(Mac环境下)

使用pip方式下载,在命令行中输入

python3 -m pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple

查询pandas版本(python中输入)

print(pd.__version__)

因为推荐使用的是pandas的最新版本1.0.3,如果电脑中已经安装了较低的可用版本,用以上命令是不能更新的,所以需要先卸载再重新安装

python3 -m pip uninstall pandas
python3 -m pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple

或者可以直接使用更新命令更新版本

python3 -m pip install --upgrade pandas -i https://pypi.tuna.tsinghua.edu.cn/simple

一、数据的读取和写入

1.csv格式

  • 读取
df = pd.read_csv('table.csv')
  • 写入
    index : 保存时除去行索引
df.to_csv('test.csv', index = False) 

2.txt格式

  • 读取
df_txt = pd.read_table('table.txt') 
  • 写入
    和csv一样
    sep : 分隔符参数
df_txt.to_csv('test.txt',sep = '\t')

3.excel格式

  • 读取
import xlrd
df_excel = pd.read_excel('table.xlsx')
  • 写入
import openpyxl
df_excel.to_excel('test.xlsx', sheet_name='Sheet1')

二、基本数据结构及其基本操作

1. Series

  • 创建
    values:值,index:索引,name:名字,dtype:类型
s = pd.Series(np.random.randn(5),
	index = ['a','b','c','d','e'],
	name = 'ISeries',dtype = 'float64')
print(s)
print("values:",s.values) # 输出属性
print("a = ",s['a'])   # 输出某一数据项

结果:

a   -1.634038
b   -0.336814
c   -0.045692
d    1.472455
e   -0.589899
Name: ISeries, dtype: float64
values: [-1.63403797 -0.33681387 -0.04569219  1.4724545  -0.58989854]
a =  -1.6340379719536748
  • 调用方法
print("mean = ",s.mean()) #求均值

结果:

mean =  -0.22679761295776563

2. DataFrame

  • 创建
    values:值,index:索引,name:名字,dtype:类型
df = pd.DataFrame({'col1':list('abcde'),'col2':range(5,10),
    'col3':[1.3,2.5,3.6,4.6,5.8]},index=list('一二三四五'))
print(df)

结果:

  col1  col2  col3
一    a     5   1.3
二    b     6   2.5
三    c     7   3.6
四    d     8   4.6
五    e     9   5.8
  • 行列操作

注意:从DataFrame中取出一列,其类型为Series

col1 = df['col1'] 
print(col1,'\n',type(col1))

结果:

一    a
二    b
三    c
四    d
五    e
Name: col1, dtype: object 
 <class 'pandas.core.series.Series'>

(1)删除

# drop()会同时删除行和列,但不改变原DataFrame
df.drop(index='五',columns = 'col2') 
# del 直接在原来的DataFrame上操作
del df['col3']
# pop()直接在原来的DataFrame上操作,且返回被删除的列
df.pop('col2')

(2)添加

# 直接添加
df['B'] = list('abcd0')
# assign()不改变原DataFrame
df.assign(C = pd.Series(list('defg0')))

(3)根据类型选择列

print(df.select_dtypes(include=['number']))

结果:

   col2  col3
一     5   1.3
二     6   2.5
三     7   3.6
四     8   4.6
五     9   5.8

(4)修改行或列名(inplace:是否将原数据结构替换为修改后格式)

df.rename(index = {'一':'one'},columns = {'col1':'new_col1'},
		inplace = True)
  • 将Series转换为DataFrame
s = df.mean()       #只求数值型变量的均值
s.name='df_mean'    #列名
news = s.to_frame()
print(news)

结果:

      df_mean
col2     7.00
col3     3.56
  • 转置
print(df.T)

结果:

        一    二    三    四    五
col1    a    b    c    d    e
col2    5    6    7    8    9
col3  1.3  2.5  3.6  4.6  5.8
  • 索引对齐特性
df1 = pd.DataFrame({'A':[1,2,3]},index=[1,2,3])
df2 = pd.DataFrame({'A':[1,2,3]},index=[3,1,2])
print(df1 - df2) 

结果:由于索引对齐,因此差不是0

   A
1 -1
2 -1
3  2
  • 调用属性和方法
    同Series,但本质是一种Aggregation操作

三、常用基本函数

1. head和tail:取出两端数据行

df.head(3) # 从头部开始取出数据行,默认为5
df.tail(3) # 从尾部开始取出数据行,默认为5

2. unique和nunique:显示唯一值

df['Physics'].nunique() # 显示有多少个唯一值
df['Physics'].unique()  # 显示所有唯一值

3. count和value_counts:计数

print(df['Physics'].count())        # 返回非缺失值元素个数
print(df['Physics'].value_counts()) # 返回每个元素有多少个

结果:(可见value_counts不统计空缺值)

35
B+    9
B     8
B-    6
A     4
A+    3
A-    3
C     2

4. describe和info:数据描述

# 默认统计数值型数据的各个统计量(percentiles:自行选择分位数)
print(df.describe(percentiles=[.05, .25, .75, .95]))  
print(df['Physics'].describe()) # 非数值型也可以用describe函数     

结果:

               ID      Height      Weight       Math
count    35.00000   35.000000   35.000000  35.000000
mean   1803.00000  174.142857   74.657143  61.351429
std     536.87741   13.541098   12.895377  19.915164
min    1101.00000  155.000000   53.000000  31.500000
5%     1102.70000  157.000000   56.100000  32.640000
25%    1204.50000  161.000000   63.000000  47.400000
50%    2103.00000  173.000000   74.000000  61.700000
75%    2301.50000  187.500000   82.000000  77.100000
95%    2403.30000  193.300000   97.600000  90.040000
max    2405.00000  195.000000  100.000000  97.000000
count     35
unique     7
top       B+
freq       9
Name: Physics, dtype: object
df.info()    # 返回有哪些列、有多少非缺失值、每列的类型

结果:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 35 entries, 0 to 34
Data columns (total 9 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   School   35 non-null     object 
 1   Class    35 non-null     object 
 2   ID       35 non-null     int64  
 3   Gender   35 non-null     object 
 4   Address  35 non-null     object 
 5   Height   35 non-null     int64  
 6   Weight   35 non-null     int64  
 7   Math     35 non-null     float64
 8   Physics  35 non-null     object 
dtypes: float64(1), int64(3), object(5)
memory usage: 2.6+ KB

5. idxmax和nlargest:最值

# 5. idxmax和nlargest
print(df['Math'].idxmax())      #返回最大值,idxmin功能类似
print(df['Math'].nlargest(3))   #返回前几个大的元素值,nsmallest功能类似

6. clip和replace:截断和替换

df['Math'].clip(33,80)  # 截断超过80或者低于33的数
# 将'street_1','street_2'分别替换为'one','two'(下面两种形式皆可)
df['Address'].replace(['street_1','street_2'],['one','two'])
df.replace({'Address':{'street_1':'one','street_2':'two'}})

7. apply函数:批量处理数据

#将表中每个数据后加一个'!'
newdf = df.apply(lambda x:x.apply(lambda x:str(x)+'!')) 
print(newdf.head(3))

结果:

  School Class     ID Gender    Address Height Weight   Math Physics
0   S_1!  C_1!  1101!     M!  street_1!   173!    63!  34.0!     A+!
1   S_1!  C_1!  1102!     F!  street_2!   192!    73!  32.5!     B+!
2   S_1!  C_1!  1103!     M!  street_2!   186!    82!  87.2!     B+!

四、排序

1. 索引排序

# set_index()指定索引
indexsort = df.set_index('Math').sort_index()
print(indexsort.head(3))

结果:

     School Class    ID Gender   Address  Height  Weight Physics
Math                                                            
31.5    S_1   C_3  1301      M  street_4     161      68      B+
32.5    S_1   C_1  1102      F  street_2     192      73      B+
32.7    S_2   C_3  2302      M  street_5     171      88       A

2. 值排序

valuessort1 = df.sort_values(by = 'Class')
print(valuessort1.head())
# 多个值排序,即先对第一层排,在第一层相同的情况下对第二层排序
valuessort2 = df.sort_values(by = ['Class','ID'])
print(valuessort2.head())

结果:

   School Class    ID Gender   Address  Height  Weight  Math Physics
0     S_1   C_1  1101      M  street_1     173      63  34.0      A+
19    S_2   C_1  2105      M  street_4     170      81  34.2       A
18    S_2   C_1  2104      F  street_5     159      97  72.2      B+
16    S_2   C_1  2102      F  street_6     161      61  50.6      B+
15    S_2   C_1  2101      M  street_7     174      84  83.3       C
  School Class    ID Gender   Address  Height  Weight  Math Physics
0    S_1   C_1  1101      M  street_1     173      63  34.0      A+
1    S_1   C_1  1102      F  street_2     192      73  32.5      B+
2    S_1   C_1  1103      M  street_2     186      82  87.2      B+
3    S_1   C_1  1104      F  street_2     167      81  80.4      B-
4    S_1   C_1  1105      F  street_4     159      64  84.8      B+

五、问题与练习

1. 问题

  • 问题一】 Series和DataFrame有哪些常见属性和方法?
    Series常用属性:
    values(值),index(索引),name(名字),dtype(类型)
    DataFrame常用属性:
    shape(大小), index(索引), columns(行), values(值)
    方法(常用的上面基本都提到了)
    更多属性和方法:
    pandas.Series — pandas 1.0.3 documentation
    pandas.DataFrame — pandas 1.0.3 documentation
  • 【问题二】 value_counts会统计缺失值吗?
    value_counts不会统计缺失值(见上方输出)
  • 【问题三】 与idxmax和nlargest功能相反的是哪两组函数?
    idxmin() 返回最小值
    nsmallest() 返回前几个小的元素值
  • 【问题四】 在常用函数一节中,由于一些函数的功能比较简单,因此没有列入,现在将它们列在下面,请分别说明它们的用途并尝试使用。
    sum:求和
    mean:求均值
    median:求中位数
    mad:平均绝对偏差
    min:最小值
    max:最大值
    abs:绝对值
    std:样品标准偏差
    var:方差
    quantile:分位数
    cummax:累计最大值
    cumsum:累计和
    cumprod:累计积
  • 【问题五】 df.mean(axis=1)是什么意思?它与df.mean()的结果一样吗?第一问提到的函数也有axis参数吗?怎么使用?
df = pd.DataFrame({'A':[1,2,3],'B':[9,8,7]},index = [1,2,3])
print(df.mean())
print(df.mean(axis=1))

结果:

A    2.0
B    8.0
dtype: float64
1    5.0
2    5.0
3    5.0
dtype: float64

可见df.mean()默认计算的是列的均值,axis=1可使其计算行的
其他函数也有此参数,同理可使其计算行的

2. 练习

  • 【练习一】 现有一份关于美剧《权力的游戏》剧本的数据集,请解决以下问题:
    (a)在所有的数据中,一共出现了多少人物?
    (b)以单元格计数(即简单把一个单元格视作一句),谁说了最多的话?
    (c)以单词计数,谁说了最多的单词?
df = pd.read_csv('joyful-pandas-master/data/Game_of_Thrones_Script.csv')

print("(a)",df['Name'].nunique())

print("(b)",df['Name'].value_counts().index[0])

# 计算每句单词数
df['word'] = df['Sentence'].apply(lambda x: len(x.split()))
# 将人名和对应句子单词数量匹配成元组
words = list(zip(df['Name'], df['word']))
# 遍历元组计算每个人的单词数量
results = {}
for item in words:
    if item[0] in results:  # 若字典中已经有此人,加上新单词数 
        results[item[0]] += item[1]
    else:                   # 若字典中无此人,将人名和单词数放入字典
        results[item[0]] = item[1]
# 字典按值排序得出结果
print("(c)",sorted(results.items(), key = lambda item:item[1], reverse = True)[0][0])

结果:

(a) 564
(b) tyrion lannister
(c) tyrion lannister
  • 【练习二】现有一份关于科比的投篮数据集,请解决如下问题:
    (a)哪种action_type和combined_shot_type的组合是最多的?
    (b)在所有被记录的game_id中,遭遇到最多的opponent是一个支?
df = pd.read_csv('joyful-pandas-master/data/Kobe_data.csv')

# 将action_type和combined_shot_type组合成元组
ac = pd.Series(list(zip(df['action_type'],df['combined_shot_type'])))
# 对元组计数并输出最大的组合
print("(a)",ac.value_counts().index[0])

# 因为不了解'opponent'是什么,所以以下过程是从参考答案中整理出来的
# 将game_id和opponent组合并去重
s1 = pd.Series(list(zip(df['game_id'],df['opponent']))).unique()
# 取出opponent
s2 = pd.Series(list(zip(*s1.tolist()))[1])
# 排序并输出
print("(b)",s2.value_counts().index[0])

结果:

(a) ('Jump Shot', 'Jump Shot')
(b) SAS
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pandas是一个开源的Python数据分析库,提供了多种数据结构,其中包括DataFrame和Panel。DataFrame是pandas中最常用的数据结构之一,它是一个二维的数据结构,数据以行和列的表格方式排列,可以执行各种行列操作和算术运算。通过pandas的DataFrame构造函数,我们可以创建一个DataFrame对象,传入数据、索引、列名等参数来构建DataFrame对象。 另外,pandas还提供了Panel这个数据结构,它是一个三维的数据结构,可以看作是DataFrame的容器,可以存储多个DataFrame。通过pandas的Panel构造函数,我们可以创建一个空的Panel对象,也可以传入数据、items、major_axis、minor_axis等参数来构建一个具有数据的Panel对象。 对于DataFrame,我们可以指定索引和列名来创建一个具有特定结构的DataFrame。在创建DataFrame时,如果给定的索引和列名的长度与数据的维度不匹配,将会报错。例如,在给定的数据列表中,如果每个内层列表的长度与列名的长度不一致,将会报错。 综上所述,pandas提供了多种数据结构,包括DataFrame和Panel,它们可以用于对数据进行分析和操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Pandas数据结构分析](https://blog.csdn.net/m0_58387972/article/details/123302776)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Python3快速入门(十三)——Pandas数据结构](https://blog.csdn.net/cdqvkn73338/article/details/100959261)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值