pandas小记:pandas数据结构和基本操作

本文详细介绍了pandas库,包括其数据结构Series和DataFrame,以及它们的基本操作,如创建、索引、操作、转换和数据清理。内容涵盖了数据类型的设置、缺失值处理、列的添加与删除、数据查看、算术运算和数据对齐等功能。此外,还讨论了如何在Series和DataFrame中处理缺失值、进行比较以及如何进行数据转换和排序。

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

http://blog.csdn.net/pipisorry/article/details/18010307

pandas的数据 结构:Series、DataFrame、索引对象
pandas基本功能:重新索引,丢弃指定轴上的项,索引、选取和过滤,算术运算和数据对齐,函数应用和映射,排序和排名,带有重复值的轴索引

Pandas介绍

pandas含有使数据分析工作变得更快更简单的高级数据结构和操作工具。它是基于NumPy构建的,让以NumPy为中心的应用变得更加简单。

通常建议你先学习NumPy,一个支持多维数组的库。但因为NumPy越来越成为一个被其他库所使用核心库,这些库通常具有更优雅的接口。使用NumPy(或者笨重的Matlab)达到同样的目的会很麻烦。

pandas可以以各种格式(包括数据库)输入输出数据、执行join以及其他SQL类似的功能来重塑数据、熟练地处理缺失值、支持时间序列、拥有基本绘图功能和统计功能,等等还有很多。

pandas常量

pandas空值的表示(None, np.NaN, np.NaT, pd.NaT)

NaN: not a number, NaN is the default missing value marker forreasons of computational speed and convenience, we need to be able to easilydetect this value with data of different types: floating point, integer,boolean, and general object.

Note: 缺失值的判断要用np.isnan(),而不能使用a[0] == np.NaN. 可能是NaN的类型是float,由于浮点数的精度的原因,NaN和NaN是不相等的。

None: treats None like np.nan. In many cases, however, the Python None will arise and we wish to also consider that “missing” or “null”.

NaT:  Datetimes, For datetime64[ns] types, NaT represents missing values. This is a pseudo-native sentinel value that can be represented by numpy in a singular dtype (datetime64[ns]). pandas objects provide intercompatibility between NaT and NaN.

inf: Prior to version v0.10.0 inf and -inf were also considered to be “null” in computations. This is no longer the case by default; use the mode.use_inf_as_null option to recover it.

[numpy教程:逻辑函数Logic functions ]

[Working with missing data]

Pandas数据结构

与Numpy一样,用dtype属性来显示数据类型,Pandas主要有以下几种dtype:

  • object -- 代表了字符串类型
  • int -- 代表了整型
  • float -- 代表了浮点数类型
  • datetime -- 代表了时间类型
  • bool -- 代表了布尔类型

pandas安装

pip install pandas

好像如果使用pd.read_excel要安装xlrd:pip install xlrd

引入相关包

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

皮皮blog

pandas​数据结构

pandas中的主要数据对象是Series和DataFrame。虽然它们不是没一个问题的通用解决方案,但提供了一个坚实的,易于使用的大多数应用程序的基础。

Series

Series是一个一维的类似的数组对象,包含一个数组的数据(任何NumPy的数据类型)和一个与数组关联的数据标签,被叫做索引 。Seriers的交互式显示的字符串表示形式是索引在左边,值在右边。

lz通过使用series自带的函数,发现它和python dict类型太像了,基本一样!就如下所述:Series是一个定长的,有序的字典,因为它把索引和值映射起来了。它可以适用于许多需要一个字典的函数。

总结说就是,他像一个数组,你可以像数组那样索引,他也想一个字典,你可以像字典那样索引。

series对象创建

如果不给数据指定索引,一个包含整数0到 N-1 (这里N是数据的长度)的默认索引被创建。 

最简单的Series是由一个数组的数据构成:

In [4]: obj = Series([4, 7, -5, 3])
In [5]: obj
Out[5]:
0 4
1 7
2 -5
3 3

通常,需要创建一个带有索引来确定每一个数据点的Series:

In [8]: obj2 = Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
In [9]: obj2
Out[9]:
d 4
b 7
a -5
c 3

可以分别的通过它的values 和index 属性来获取Series的数组表示和索引对象。

values 属性返回一个包含在Series中的数据的一维ndarray:

In [6]: obj.values
Out[6]: array([ 4, 7, -5, 3])
In [7]: obj.index
Out[7]: Int64Index([0, 1, 2, 3])

Note: pandas对象(series和dataframe)的index是可以修改的

df.index = range(len(df))重新将index的值修改成了从0开始。这也许是和dict的一个不同吧。

[Start index at 1 when writing Pandas DataFrame to CSV]

另一种思考的方式是,Series是一个定长的,有序的字典,因为它把索引和值映射起来了。它可以适用于许多需要一个字典的函数:

In [18]: 'b' in obj2
Out[18]: True
In [19]: 'e' in obj2
Out[19]: False

如果你有一些数据在一个Python字典中,你可以通过传递字典来从这些数据创建一个Series

In [20]: sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
In [21]: obj3 = Series(sdata)

只传递一个字典的时候,结果Series中的索引将是排序后的字典的建。

In [23]: states = [‘California’, ‘Ohio’, ‘Oregon’, ‘Texas’]
In [24]: obj4 = Series(sdata, index=states)

In [25]: obj4

Out[25]:California NaNOhio 35000Oregon 16000Texas 71000

在这种情况下, sdata 中的3个值被放在了合适的位置,但因为没有发现对应于 ‘California’ 的值,就出现了NaN (不是一个数),这在pandas中被用来标记数据缺失或NA 值。我使用“missing”或“NA”来表示数度丢失。

Series的字典也以嵌套的字典的字典格式的方式来处理:

In [62]: pdata = {'Ohio': frame3['Ohio'][:-1],
  ....: 'Nevada': frame3['Nevada'][:2]}

In [63]: DataFrame(pdata)
Out[63]:
     Nevada Ohio
2000    NaN  1.5
2001    2.4  1.7

series对象转换为字典dict

从series的字典构建中可以看出他们互相转换的机制了:将series对象的index作为keys,对应的值作为dict的value。

obj2 = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
d    4
b    7
a   -5
c    3
dtype: int64
In[27]: dict(obj2)
{'a': -5, 'b': 7, 'c': 3, 'd': 4}

series对象转换为tuple列表

list(se.items())

pandas中用函数isnull 和notnull 来检测数据丢失,Series也提供了这些函数的实例方法:

In [28]: obj4.isnull()
California True
Ohio False
Oregon False
Texas False

series对象操作

series对象迭代

Series.iteritems()

Lazily iterate over (index, value) tuples

[i.split(',') for _, i in df['VenueCategory'].iteritems()]

与正规的NumPy数组相比,你可以使用索引里的值来选择一个单一值或一个值集:

In [11]: obj2['a']
Out[11]: -5
In [12]: obj2['d'] = 6
In [13]: obj2[['c', 'a', 'd']]
c 3
a -5
d 6

NumPy数组操作,例如通过一个布尔数组过滤,纯量乘法,使用数学函数,将会保持索引和值间的关联:

In [14]: obj2
Out[14]:
d 6
b 7
a -5
c 3
In [15]: obj2[obj2 > 0]   In [16]: obj2 * 2       In [17]: np.exp(obj2)
Out[15]:                  Out[16]:                Out[17]:
d 6                       d 12                    d 403.428793
b 7                       b 14                    b 1096.633158
c 3                       a -10                   a 0.006738
                          c 6                     c 20.085537

在许多应用中Series的一个重要功能是在算术运算中它会自动对齐不同索引的数据:

In [29]: obj3        In [30]: obj4
Out[29]:             Out[30]:
Ohio 35000           California NaN
Oregon 16000         Ohio 35000
Texas 71000          Oregon 16000
Utah 5000            Texas 71000
In [31]: obj3 + obj4
Out[31]:
California NaN
Ohio 70000
Oregon 32000
Texas 142000
Utah NaN

Series对象本身和它的索引都有一个 name 属性,它和pandas的其它一些关键功能整合在一起:

In [32]: obj4.name = 'population'
In [33]: obj4.index.name = 'state'
In [34]: obj4
Out[34]:
state
California NaN
Ohio 35000
Oregon 16000
Texas 71000
Name: population

Series索引更改

可以通过赋值就地更改:

In [35]: obj.index = ['Bob', 'Steve', 'Jeff', 'Ryan']
In [36]: obj
Out[36]:
Bob 4
Steve 7
Jeff -5
Ryan 3

series值替换

ser.replace(1, 11)

可以使用字典映射:将1替换为11,将2替换为12
ser.replace({1:11, 2:12})

DataFrame.replace[pandas小记:pandas数据规整化-缺失、冗余、替换]

删除条目drop()

丢弃某条轴上的一个或多个项很简单,只要有一个索引数组或列表即可。由于需要执行一些数据整理和集合逻辑,所以drop方法返回的是一个在指定轴上删除了指定值的新对象:

In [94]: obj = Series(np.arange(5.), index=['a', 'b', 'c', 'd', 'e'])
In [95]: new_obj = obj.drop('c')
In [97]: obj.drop(['d', 'c'])
Out[97]:
a   0
b   1
e   4

series列分割转换成dataframe

s = pd.Series(['15,15', '17,17', '36,36', '24,24', '29,29'])
print(type(s))
print(s)
s = s.apply(lambda x: pd.Series(x.split(',')))
print(type(s))
print(s)

<class 'pandas.core.series.Series'>
0    15,15
1    17,17
2    36,36
3    24,24
4    29,29
dtype: object
<class 'pandas.core.frame.DataFrame'>
    0   1
0  15  15
1  17  17
2  36  36
3  24  24
4  29  29

Note: series对象直接应用apply方法是不会改变原series对象的,要赋值修改。

[series属性和方法参考pandas.Series]

series比较

两个index不同的series不能直接比较,否则会出错:“Can only compare identically-labeled DataFrame objects”
解决:转成ndarray再比较:series1.values > series2.values

皮皮blog

DataF

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值