day05

pandas

数据结构与使用

 首先:导入numpy和pandas

import numpy as np

import pandas as pd

Series

Series是带标签的一维数组,可存储整数、浮点数、字符串、Python 对象等类型的数据。轴标签统称为索引。调用 pd.Series 函数即可创建 Series:

s = pd.Series(data, index=index)

data 是多维数组时,index 长度必须与 data 长度一致。没有指定 index 参数时,创建数值型索引,即 [0, ..., len(data) - 1]

df1 = pd.Series(['chuan', '18', '男', 'anhui'], index=['姓名', 'age', 'gender', 'loc'])
print(df1)
# index是轴标签列表,若index无值,则默认为0,1,2,3...

输出结果:

字典

Series 可以用字典实例化:

s = {'name': '付泳波', 'age': '23', 'hobby': 'basketball', 'loc': '安徽六安'}
a = pd.Series(s)
print(a)

 输出结果:

Series 按字典的插入顺序排序索引。

标量值

 data 是标量值时,必须提供索引。Series索引长度重复该标量值。广播

s=pd.Series(5.,index=[1,2,3,4,5])
print(s)

输出结果:

series类似多维数组

Series 操作与 ndarray 类似,支持大多数 NumPy 函数,还支持索引切片。

s = {'name': '付泳波', 'age': '23', 'hobby': 'basketball', 'loc': '安徽六安'}
a = pd.Series(s)
print(a[:3])
print(a[[2,3,1]])

输出结果:

Series 只是类似于多维数组,提取真正的多维数组,要用 Series.to_numpy()

s = {'name': '付泳波', 'age': '23', 'hobby': 'basketball', 'loc': '安徽六安'}
a = pd.Series(s)
print(a.to_numpy())

Series 是扩展数组Series.to_numpy()返回的是 NumPy 多维数组

Series类似字典

 Series 类似固定大小的字典,可以用索引标签提取值或设置值,引用 Series 里没有的标签会触发异常:

 get 方法可以提取 Series 里没有的标签,返回 None 或指定默认值

s = {'name': 'reynolds', 'age': '23', 'hobby': 'basketball', 'loc': '安徽'}
a = pd.Series(s)
print(a['name'])
print(a.get('name'))

输出结果:

 Dataframe

DataFrame 是由多种类型的列构成的二维标签数据结构,类似于 Excel 、SQL 表,或 Series 对象构成的字典。DataFrame 是最常用的 Pandas 对象,与 Series 一样,DataFrame 支持多种类型的输入数据

d = {'one': pd.Series([1., 2., 3.], index=['a', 'b', 'c']),'two': pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print(df)
print("----------------------")
d2 = pd.DataFrame(d, index=['d', 'b', 'a'])
print(d2)
print("----------------------")
d3 = pd.DataFrame(d, index=['d', 'b', 'a'], columns=['two', 'three'])
print(d3)

输出结果:

print(df.index) # 获取所有的索引
print(df.columns) # 获取所有的列

输出结果:

用多维数组字典、列表字典生成 DataFrame

d = {'one': [1, 2, 3], 'two': [4, 5, 6]}
df = pd.DataFrame(d,index=['a','b','c'])
print(df)

 输出结果:

用列表字典生成 DataFrame

d = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(d)
df2=pd.DataFrame(d, index=['first', 'second'])
df3=pd.DataFrame(d,columns=['a','b'])
print(df)
print(df2)
print(df3)

输出结果:

提取、添加、删除列

DataFrame 就像带索引的 Series 字典,提取、设置、删除列的操作与字典类似:

d = {'one': pd.Series([1., 2., 3., 8.], index=['a', 'b', 'c', 'd']),
     'two': pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print(df)
print()
print(df['one'])
df['three']=df['one']*df['two']
df['flag']=df['three']>5
print(df)

输出结果:

 删除(del、pop)列的方式也与字典类似:

del df['three']
df.pop('two')
print(df)

输出结果: 

标量值以广播的方式填充列

df['foo']='bar'
print(df)

 输出结果:

 插入与 DataFrame 索引不同的 Series 时,以 DataFrame 的索引为准:

可以插入原生多维数组,但长度必须与 DataFrame 索引长度一致。

默认在 DataFrame 尾部插入列。insert 函数可以指定插入列的位置:

df['one_trunc'] = df['one'][:2]
df.insert(1, 'bar', df['one'])
print(df)

输出结果:

索引 / 选择

索引基础用法如下:

选择行返回 Series,索引是 DataFrame 的列:(df为上述列表)

print(df.loc['b'])
print(df.iloc[2])
print(df[1:3])

输出结果:

 合并操作

结合(Concat)

 Pandas 提供了多种将 Series、DataFrame 对象组合在一起的功能,用索引与关联代数功能的多种设置逻辑可执行连接(join)与合并(merge)操作。

concat()用于连接 Pandas 对象:

df=pd.DataFrame(np.random.randn(4,5))
df1=pd.DataFrame(np.random.randn(4,5))
df2=pd.concat([df,df1]) #此处必须以列表传入
print(df2)

输出结果:

连接(join)

left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})
right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})
print(pd.merge(left,right))
print(pd.merge(left,right,on='key'))

输出结果:

 

left = pd.DataFrame({'key': ['foo', 'bar'], 'lval': [1, 2]})
right = pd.DataFrame({'key': ['foo', 'bar'], 'rval': [4, 5]})
print(pd.merge(left, right, on='key'))

输出结果: 

追加(Append)

df = pd.DataFrame(np.random.randn(8, 4), columns=['A', 'B', 'C', 'D'])
df2=df.iloc[3]
print(df2)
print(df.append(df2,ignore_index=True)) #ignore_index为true指插入的行不使用其本身的索引

 输出结果:

分组

“group by” 指的是涵盖下列一项或多项步骤的处理流程:

  • 分割:按条件把数据分割成多组;

  • 应用:为每组单独应用函数;

  • 组合:将处理结果组合成一个数据结构。

 

df = pd.DataFrame({'xiaohu': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
                    'dahu': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
                    'xiaoli': np.random.randn(8),
                    'dali': np.random.randn(8)})
print(df)
df1=df.groupby('xiaohu').sum()
df2=df.groupby('dahu').count()
print(df1)
print(df2)

输出结果:

 

df1=df.groupby(['xiaohu','dahu']).sum()
print(df1)

 

过滤索引查询(filter)

需要注意的是,此方法不会对数据帧的数据内容进行过滤,仅应用于按标签筛选。

其中的参数 items, like, 和 regex parameters 被强制执行为相互排斥,即只能有一个存在。轴默认为使用 [] 索引时使用的信息轴(info axis,按行)。

df = pd.DataFrame(np.array(([1, 2, 3], [4, 5, 6])),
                  index=['mouse', 'rabbit'],
                  columns=['one', 'two', 'three'])
print(df)
df2 = df.filter(items=['one', 'three'])  # 根据列名选择列
print(df2)
df3 = df.filter(regex='o')  # 根据正则表达式匹配列
print(df3)
df4 = df.filter(like='bit', axis=0)  # 选择包含“bbi”的行
print(df4)

输出结果:

 

 

排序(sort_values)

dic = {'name': ['kiti', 'beta', 'peter', 'tom'],
          'age': [20, 18, 35, 21],
          'gender': ['f', 'f', 'm', 'm']}
df = pd.DataFrame(dic)
df1=df.sort_values(by=['age']) #根据年龄升序
print(df1)
df2 = df.sort_values(by=['age'],ascending=False) #根据年龄降序
print(df2)

运行结果:

 
Pandas操作CSV类型文件

xxx.csv 列之间的默认分隔符是英文逗号

xxx.xlsx 记事本打开是看不懂的

read_csv()读文件

一般情况下,会将读取到的数据返回一个DataFrame,当然按照参数的要求会返回指定的类型。

 

参数说明

传参路径

filepath_or_buffer为第一个参数,没有默认值,也不能为空,根据Python的语法,第一个参数传参时可以不写参数名。可以传文件路径:

df1 = pd.read_csv('demo1.csv', encoding='gbk')
print(df1)

分隔符

 sep参数是字符型的,代表每行数据内容的分隔符号,默认是逗号,另外常见的还有制表符(\t)、空格等,根据数据的实际情况传值。

# 数据分隔符默认是逗号,可以指定为其他符号

data = pd.read_csv("C:\\Users\\xiaohu\\Desktop\\demo1.csv", encoding="gbk", sep=",|:|;", engine="python", header=0)
print(data)

 输出结果

 

index_col

 

这个参数是用来决定读进来的数据哪一列做索引的。

这个参数的缺省值是False,就是什么都不做的意思。

咱们来指定第一列看看,第一列在Python里被标做1:(从0开始)

data = pd.read_csv("C:\\Users\\xiaohu\\Desktop\\demo1.csv", encoding="gbk", index_col=1)

 输出结果:

 

usecols

这个参数可以指定你从文件中读取哪几列。比如这样:

data = pd.read_csv("C:\\Users\\xiaohu\\Desktop\\demo1.csv", encoding="gbk", usecols=[2,3])

运行结果:

 

nrows

指定读取记录多少行。

data = pd.read_csv("C:\\Users\\xiaohu\\Desktop\\demo1.csv", encoding="gbk", nrows=10)

运行结果:

 

to_csv()写文件

将Dataframe保存为一个csv文件

 df.to_csv("a.csv")

参数说明:

index

缺省index=True,就是上面看到的a到d是索引号。如果你不加这个参数,写文件时会连带索引号一起写入。

df.to_csv("a.csv", index=False)

columns

按指定的列写入文件,我在下面只写入文件1列,有意去掉了读操作。

 df.to_csv("a.csv", index=False,columns=['two'])

 sep

这是分隔符参数,缺省列与列之间用逗号分隔。不过有很多单位由于历史数据采用的分隔符多种多样,为了适应这种情况,你可以用这个参数指定分隔符。

df.to_csv("a.csv", sep='\t')

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值