Pandas常用操作

144 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

Pandas的两种数据结构(pandas是基于Numpy来进行构建的,让以Numpy为中心的应用变得更加的简单)

一、Pandas简介

1-1、Series(类似一维数组的对象,由values和index组成,及由数据和索引构成):

1-1-1、使用

import pandas as pd
from pandas import Series,DataFrame
obj = Series(['a', 'b', 'c'], index=[1, 2, 3])
# 我们也可以把Series当作字典来使用,这时候,Series中的索引就是字典中的键。

1-1-2、切片

标签索引(即行和列的名称): loc[]
整型索引(几行几列,起始索引为0): iloc[]

import pandas as pd
df = pd.DataFrame({'a': [1, 2, 3], 'b': ['a', 'b', 'c'],'c': ["A","B","C"]})
print(df)
   a  b  c
0  1  a  A
1  2  b  B
2  3  c  C
# 选择多行
# 选择12行,选择所有列
print(df.loc[1:2,:])
   a  b  c
1  2  b  B
2  3  c  C

1-2、DataFrame(是一个表格型的数据结构,索引既有行索引也有列索引):

1-2-1、构建

import pandas as pd
from pandas import Series,DataFrame
# 左边是列索引。
data = {
	'60年代': {'狗子', '嘎子', '秀儿'},
	'70年代': {'卫国', '建国', '爱国'},
}
frame_data = DataFrame(data)
# T:转置操作。
frame_data.T

1-2-2、查询操作:

1、单个label值查询:df.loc[行名,列名] 2、使用值列表批量查询: df.loc[[多行名],列名] 3、使用数值区间范围查询:df.loc[起始行名:结尾行名,列名] 4、使用条件表达式查询:df.loc[行名判断筛选,列名] 备注:如果有多个条件的话,可以使用添加与或非连接他们。 5、调用函数查询:

1-2-3、pandas新增数据列:

1、直接赋值 2、apply(函数): 映射,赋予某种函数关系。 3、assign 4、分条件赋值

# 1、直接赋值
# 增加一行,都赋值为4
df.loc[3,:]=4

1-2-4、处理丢失数据:

1、判断是否非空 isnull() 例如:pd.isnull(要判断的数据) 2、notnull() 3、过滤函数 dropna() 4、填充函数 fillna() 其他注意: 1、None与NaN pandas中None和np.nan都视为np.nan。 numpy中None不参与运算。 2、填充方式 均值填充 向前填充、向后填充(使用到了fillna里的参数method) 线性差值填充 (np.linspace(开始值,结束值,分为多少份))

1-2-5、删除行、列

# 删除第0行。
df.drop(0,axis=0,inplace=True)
# inplace默认为False,如果为True则表示替换原dataframe
# 删除第0列。
df.drop(0,axis=1,inplace=True)

1-2-6、更改列名

# 把列名s改为c
df.rename(columns={’s’:’c’}, inplace=True)
# inplace默认为False,如果为True则表示替换原dataframe

1-2-7、分组和合并、过滤:

1、分组:groupby() 2、过滤:filter() 3、汇总操作:aggregate()

1-2-8、表格匹配与拼接:

1、concatenate(concat()函数) 2、append 3、合并:merge() 4、join()

1-2-9、文件读取(read_csv、read_excell、read_sql):

read_csv():

# 默认分隔符为逗号
import pandas as pd
# skiprows:跳过哪一行数据
# header: 默认把第一行当作头部,如果指定header为None,则自动生成头部。
# nrows: 指定读取行数,只读取几行。(针对比较大的文件)
# sep: 指定分隔符是什么
dd = pd.read_csv('dd.csv',  skiprows=[0], header=None, nrows=5)

read_excell():

# sheet_name: 指定工作表
# 其他参数:
# header: 表示用第几行作为表头,默认header=0,即默认第一行作为表头, header=None,表示不使用数据源中的表头。
# header为1,即选择第二行作为表头,其上的数据就不要了。
# names: 表示自定义表头名称,需要传递数组参数
# index_col: 指定列为索引列,默认为None。 index_col=0,指定第0列为索引列
excel = pd.read_excel('data_excel.xlsx', sheet_name='工作表')
# plot根据excel绘制图表,
# kind: 绘制模式
excel.plot(kind = 'scatter', x='age', y='place').get_figure()
# notice: 经过验证,通常情况下来说csv格式的文件要比excel格式类型的文件大的多。
# df: 读取的文件一般都保存为DataFrame格式的文件。

read_sql()

# 读取SQL语句,conn为数据库引擎,返回值是DataFrame。
conn = psycopg2.connect(host='*******', user='******', password='*******',
                            dbname='*******', port=*******)
sql = f'select * from ljl_temp."{table}"'
df = pd.read_sql(sql, conn)
conn.close()

1-2-11、索引重置reset_index():

import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(20).reshape(5,4),index=[1,3,4,6,8])
print(df)
print(df.reset_index(drop=False))
# drop参数默认为False
# 如果需要直接使用重置后的索引,则需要直接把drop改为True,即把原来的index直接删掉。
# inplace = True: 直接替换掉原表。

1-2-13、确认数据出现的频率

# value_counts(): 可以对dataframe中的每个值进行计数并且排序
# ascending: 是否升序排列,bool类型参数
# normalize: 是否统计占比,bool类型参数
df['区域'].value_counts(normalize=True)
# 上海:0.7
# 深圳:0.1
# 广西:0.1
# 山西:0.1
df['区域'].value_counts()
# 上海:70
# 深圳:10
# 广西:10
# 山西:10
# 注意:df['区域']是series类型,如果是dataframe类型进行数据统计
df.apply(pd.value_counts)

1-2-14、

其他操作: 1、重新索引:reindex(新的索引列表, fill_value=空值填充成什么) 其他参数: method: (ffill 前向值填充 bfill 后向填充) 2、排序: sort_values(), sort_index() 3、日期生成:data_range('20200101', periods=6) 4、stack(): stack函数会把列索引转成行索引,即把列索引换成二级的行索引,即所有列压缩到一列。

# shift+tab查看函数源码
datas = pd.date_range('20211222', periods=7)
pd.DataFrame(np.random.randn(7,4), index=datas, columns=['a', 'c', 'b', 'f'])