基础知识_Pandas基础操作(一)

目录

一、读写数据文件

  1.1、 读取、保存csv文件

  1.2、读取、保存excel 文件【小代码库excel处理】

二、基本数据类型

  2.1、第一种数据类型Series

    2.1.1、Series的常见属性

    2.1.2、Series的索引和切片

    2.1.3、Series的增删改

  2.2、第二种数据类型:DataFrame

    2.2.1、DataFrame的常见属性

    2.2.2、DataFrame的索引和切片★

    2.2.3、DataFrame的增删改查

三、对DataFrame进行统计分析★

  3.1、对数据进行整体查看 .info() .head() .tail()

  3.2、对数据进行整体的统计描述 .describe()

  3.3、对单个统计量的分析

  3.4、类别变量频词统计 .value_counts()

四、Pandas的MultiIndex多层索引使用


NLP Numpy、Pandas、Scikit-learn资料:

                 NLP Numpy、Pandas、Scikit-learn资料下载

一、读写数据文件

  1.1、 读取、保存csv文件

import numpy as np
import pandas as pd
df_csv = pd.read_csv('./data/data1_try_read.csv', encoding='utf-8')
df_csv.loc[0, '城市'] = '上海'
df_csv

df_csv.loc[0, '城市'] = '上海'     # 更改 dataframe的数据【直接赋值即可】
df_csv

 

# 保存为 csv 文件
df_csv.to_csv('./data/data1_try_output.tsv', sep='\t', encoding='utf-8', index=False, header=None)  # 

  1.2、读取、保存excel 文件【小代码库excel处理

import numpy as np
import pandas as pd
df_excel = pd.read_excel('./data/data2_try_read.xlsx')  # 具体可以看小代码库中对excel的处理【https://blog.csdn.net/qq_16555103/article/details/107178264】

df_excel.loc[3] = ['语文', 60, '韩梅梅']  # dataframe 添加数据【直接赋值,不存在就会新增数据】
df_excel

 

df_excel.to_excel('./data/data2_try_output.xlsx', index=None, sheet_name='成绩单')

二、基本数据类型

  2.1、第一种数据类型Series

import numpy as np
import pandas as pd
sr1 = pd.Series([1, 2, 3, 4], index=[101, 102, 103, 104])
101    1
102    2
103    3
104    4
dtype: int64
tip:Series 中整形默认的数据类型是 int64,而numpy整形默认的数据类型是int32
import numpy as np
import pandas as pd
sr1 = pd.Series([1, 2.5, 3, 4], index=[101, 102, 103, 104])
101    1.0
102    2.5
103    3.0
104    4.0
dtype: int64
tip:Series 如果仅仅存在整形与浮点型,series会将整形转化为浮点型数据【dataframe不会这样】

    2.1.1、Series的常见属性

import numpy as np
import pandas as pd
​
sr1.dtype   # dtype('int64')
sr1.name
sr1.index   # Int64Index([101, 102, 103, 104], dtype='int64')
sr1.values  # 转化为numpy数组,因此不同的数据类型将会转化为一种

    2.1.2、Series的索引和切片

         a、简单的切片方式【不推荐】

import numpy as np
import pandas as pd
# 索引取值
sr1[102]  # 默认使用的是 .loc
# 切片
str[1:2]  # 默认使用的 .iloc 

tip:这种方式很混乱,所以不建议使用直接 索引或者是切片的方法,推荐使用 .loc .iloc 的方式

         b、正规的切片方式 .iloc .loc【推荐】

               .loc 使用索引名称进行索引tip:只有 .loc方法支持bool索引,.iloc不支持

sr1.loc[103]      # 是一个值
sr1.loc[102:103]  # 使用名称索引时,切出来的是前后闭区间; tip:切片的结果是一个Series,即使他只有一个元素,这一点要区别于索引取值
sr1.loc[[101, 103]]
sr1.loc[[True, False, False, True]]
# 布尔型的索引
sr1.loc[sr1>2]    # 注意:只有 .loc的方式支持bool索引

               .iloc 使用下标进行索引

sr1.iloc[2]  # 使用下标索引
sr1.iloc[2:3] # 下标切片,前比后开的区间
sr1.iloc[[1, 3]]

    2.1.3、Series的增删改

         a、Series的查看:上文切片与索引均为查看方式

# 原始Series
print(sr1)

         b、Series更改数据:上文切片与索引 直接赋值即可

# 按索引更改单个值
sr1.loc[101] = 666
# 按切片更改多个值
sr1.iloc[2:4] = [33, 44]
# 按逻辑索引更改符合条件的多个值
sr1.loc[(sr1>10) & (sr1<100)] = 0

         c、Series增加数据:上文切片与索引 直接赋值即可,不存在即为添加数据

# 增加一个值
sr1.loc[105] = 5

# 使用 .append 方法 【tip:被append 的数据必须是Series,即便是一个值,也要转化为Series】
sr1.append(pd.Series([2], index=[105]), verify_integrity=False)

 

         d、Series删除数据:.drop、del、pop

               drop:

注意:

  • drop删除只能使用名称索引【不能是下标索引】
  • drop方法仅返回一个新对象,不影响原Series,要更改原Series对象则需要设置inplace参数 
sr1 = sr1.drop(102)  # tip:需要重新赋值原数组

             del 、pop 

注意:

  • del 直接删除不会复原
  • pop() 对下标进行删除,可以返回删除的值,默认重末尾开始删除

  2.2、第二种数据类型:DataFrame

# 字典的一阶key是列名,二阶key是行索引名
df1 = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]},
                   index=[101, 102, 103])

out:
	a	b
101	1	4
102	2	5
103	3	6
# 直接使用 数据 + index + columns 创建DataFrame【这种方式也可以创建一个空的DataFrame】
df2 = pd.DataFrame(np.arange(1, 13).reshape((3, 4)),
                   index=[101, 102, 103],
                   columns=["年龄", "价格", "金额", "人口"])

out:
	年龄	价格	金额	人口
101	1	2	3	4
102	5	6	7	8
103	9	10	11	12

    2.2.1、DataFrame的常见属性

df1.dtypes   # tip:相对于 Series来说,这里添加了 ‘s’
df1.columns
df1.index
df1.values
df1.shape
df1.size
df1.ndim

    2.2.2、DataFrame的索引和切片★

         a、简单的切片方式【不推荐】

import numpy as np
import pandas as pd

# 列索引【DataFrame直接索引默认是索引列】
    # 列的简单索引第一种方式(重点,特别常用)
df2['年龄']

out:
101    1
102    5
103    9
Name: 年龄, dtype: int32

    # 列的简单索引第二种方式(不推荐!)
df2.年龄

out:
101    1
102    5
103    9
Name: 年龄, dtype: int32

    # 多个列同时索引(常用)
df2[['年龄', '金额']]

	年龄	金额
101	1	3
102	5	7
103	9	11

        tip: 逻辑索引使用行索引的 

import numpy as np
import pandas as pd

# 简单的行索引
    # 逻辑索引方式
df2[[False, True, True]]  # tip: 这种逻辑索引是使用行索引的

out:
	年龄	价格	金额	人口
102	5	6	7	8
103	9	10	11	12

    # 逻辑索引
df2[df2['人口']<10]

out:
	年龄	价格	金额	人口
101	1	2	3	4
102	5	6	7	8

          b、正规的切片方式 .iloc .loc  .at .iat【推荐】

               更规范的多个值索引或切片lociloc

重点:只要涉及到行列同时定位的多个值索引或切片,一律使用lociloc

注意:

  • 使用loc时,可以混合使用单个索引列表形式多个索引逻辑索引,而且使用名称的方式代码可读性更高,应优先考虑使用loc
  • 但使用iloc时,只可以混合使用单个索引列表形式多个索引,无法使用逻辑索引

               .loc 使用索引名称进行索引tip:只有 .loc方法支持bool索引,.iloc不支持

# 多个值以行列名称索引示例1
df2.loc[102, ['年龄', '价格', '人口']]

out:
年龄    5
价格    6
人口    8
Name: 102, dtype: int32

# 多个值以行列名称索引示例2
df2.loc[[101, 103], '价格':'金额']

out:

价格	金额
101	2	3
103	10	11

# 多个值以行列名称索引示例3
df2.loc[df2['价格']>4, '金额':'人口']

out:
	金额	人口
102	7	8
103	11	12
# 使用 loc 中的bool 索引与列 来重新赋值另一个dataframe使用 loc 中的bool 索引与列的值
content_df.loc[~content_df['违规类型'].isnull(),['投放主题']] =
 content_df.loc[~content_df['违规类型'].isnull(),['违规类型']].values 

tip:上述 赋值的过程中一定要加上 .values将其转化为数组,否则可能赋值失败

               .iloc 使用下标进行索引

# 多个值以行列名称索引示例1
df2.iloc[2, [0, 2, 3]]

out:
年龄     9
金额    11
人口    12
Name: 103, dtype: int32

# 多个值以行列名称索引示例2
df2.iloc[[1, 2], 0:2]

out:

	年龄	价格
102	5	6
103	9	10

               .at .iat 最高效的索引一个值,不会创建新的内存空间

at   # 使用索引名称
iat  # 使用下标

    2.2.3、DataFrame的增删改查

             增添和更改值:实际上,增和改就是在索引定位的基础上进行赋值操作

import numpy as np
import pandas as pd

df2

out:
	年龄	价格	金额	人口
101	1	2	3	4
102	5	6	7	8
103	9	10	11	12

df2.loc[102, '价格':'金额'] = [66, 77]

out:
	年龄	价格	金额	人口
101	1	2	3	4
102	5	6	7	8
103	9	10	11	12

              删除值:drop

注意:

  • drop删除只能使用名称索引
  • 用axis参数指定删除行/列,默认axis=0,即删除行,可指定axis=1用于删除列
  • drop方法仅返回一个新对象,不影响原DataFrame,要更改原DataFrame对象则需要设置inplace参数 
df2.drop(102)

out:
	年龄	价格	金额	人口
101	1	2	3	4
103	9	10	11	12

df2.drop(['年龄', '人口'], axis=1)

	价格	金额
101	2	3
102	6	7
103	10	11

三、对DataFrame进行统计分析★

  3.1、对数据进行整体查看 .info() .head() .tail()

import numpy as np
import pandas as pd

df.info()
df.head(5)
df.tail(5)

  3.2、对数据进行整体的统计描述 .describe()

import numpy as np
import pandas as pd

df4 = pd.DataFrame({"a": [53, 232, 85],
                    "b": [1.94, 23.8, np.nan]})

out:
a	b
0	53	1.94
1	232	23.80
2	85	NaN

df4.describe().round(0).T     # round(0) : 取小数点0位,tip:describe不会统计 NaN 的值

count	mean	std	min	25%	50%	75%	max
a	3.0	123.0	95.0	53.0	69.0	85.0	158.0	232.0
b	2.0	13.0	15.0	2.0	7.0	13.0	18.0	24.0

# 数据如果不是数字,describe()得到的结果是有差异的
df5 = pd.DataFrame({"城市": ["北京", "杭州", "乌鲁木齐"],
                    "猫": ["波斯", "布偶", "布偶"]})

out:
城市	猫
0	北京	波斯
1	杭州	布偶
2	乌鲁木齐	布偶

df5.describe()

out:
	城市	猫
count	3	3
unique	3	2
top	杭州	布偶
freq	1	2

# 如果 数值的数据类型与字符串的数据类型同时存在,describe只会统计数值类数据类型【如果相同统计字符串数据类型,只能将这些字符串列取出,然后进行 describe() 】
df6 = pd.DataFrame({
    "姓名": ["韩梅梅", "李雷", "露西"],
    "爱好": ["吃", "跳", "跳"],
    "体重": [180, 90, 110]
})

out:
	姓名	爱好	体重
0	韩梅梅	吃	180
1	李雷	跳	90
2	露西	跳	110

df6.describe().T

out:
count	mean	std	min	25%	50%	75%	max
体重	3.0	126.666667	47.258156	90.0	100.0	110.0	145.0	180.0

df6[["姓名", "爱好"]].describe()

out:
	姓名	爱好
count	3	3
unique	3	2
top	李雷	跳
freq	1	2

  3.3、对单个统计量的分析

           常见的函数列表

import numpy as np
import pandas as pd

df7 = pd.DataFrame(np.random.randn(5, 6), columns=list('ABCDEF'), index=range(101, 106))
df7["C"] = list("王牌对王牌")

out:
	A	B	C	D	E	F
101	0.403545	-2.258201	王	-0.753228	0.860266	1.419144
102	-0.792360	0.661638	牌	-1.479688	-1.361139	-0.353684
103	0.468519	0.725593	对	-0.701611	-1.077419	0.360764
104	-1.021946	-1.395921	王	1.480520	-0.024066	1.423713
105	-0.087719	0.970290	牌	-0.213864	0.804652	-0.898303
# 查看B列和F列特征的均值【默认是对列进行统计,对行统计请指定 axis=1】
df7[["B", "F"]].mean()

out:
B   -0.259320
F    0.390327
dtype: float64

# 查看103和105行特征的方差
df7.loc[[103, 105], :].var(axis=1)

out:
103    0.629796
105    0.595793
dtype: float64

# 查看C列的众数
df7["C"].mode()

out:
0    牌
1    王
dtype: object

  3.4、类别变量频词统计 .value_counts()

import numpy as np
import pandas as pd

df7["C"].value_counts()

out:
王    2
牌    2
对    1
Name: C, dtype: int64

四、Pandas的MultiIndex多层索引使用

        Pandas的MultiIndex多层索引创建高维dataframe与使用

        python Dataframe多索引切片操作 行多层索引​​​​​​​

        Pandas详解十四之DataFrame对象的列和索引之间的转化​​​​​​​

层次索引正常情况下切片高维行索引会报错,以下两个方法可以解决:
    ①使用数组的方式进行切片
df.loc[[(一级索引,二级索引,三级索引),(一级索引,二级索引,三级索引),(一级索引,二级索引,三级索引),(一级索引,二级索引,三级索引)],列索引]
    ② 构造 pd.multiindex 的层次索引后,用层次索引进行切片
multi = pd.multiindex.from_tuples([[],[],[]]) # pd.multiindex 有三种构造方式,详情看上面链接
df.loc(multi,列索引)

tip:层次索引不能用赋值的方法新增数据,没有key会报错,可以用reset_index() 将高维转化为2维,新增数据后用set_index()转化为高维

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值