pandas 数据结构

基本原则数据对齐是内在的。标签和数据之间的链接不会被破坏,除非你明确这样做。

Series(序列)

Series是带有标签的一维数组,可以保存任何数据类型(整数字符串浮点数Python对象等)。轴标签统称为索引

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

这里,data可以是许多不同的东西:

  • Python dict(字典)
  • ndarray
  • 标量值(如5)

传入的索引是轴标签的列表。因此,根据数据的类型,分为以下几种情况:

来自ndarray

如果data是ndarray,则索引必须与数据长度相同。如果没有传递索引,将创建值为[0, ..., len(data) - 1]的索引。

>>> s = pd.Series(data=np.random.randn(5), dtype=np.float32, index=['a', 'b', 'c', 'd', 'e'])
>>> s
a    0.755472
b   -0.565683
c    0.325820
d   -0.039064
e   -0.469198
dtype: float32

>>> s.index
Index(['a', 'b', 'c', 'd', 'e'], dtype='object')

>>> s = pd.Series(data=np.random.randn(5), dtype=np.float64)
>>> s
0   -1.194776
1    1.028467
2   -0.607143
3    1.729527
4   -0.029426
dtype: float64

>>>s.index
RangeIndex(start=0, stop=5, step=1)

注意: 从v0.8.0开始,pandas支持非唯一索引值。如果尝试执行不支持重复索引值的操作,那么将会引发异常。延迟的原因几乎都基于性能(在计算中有很多实例,例如 GroupBy 的部分不使用索引)。

来自字典

如果data是字典,那么如果传入了index,则会取出数据中的值,对应于索引中的标签。否则,如果可能,将从字典的有序键构造索引。

>>> pd.Series(dict(zip(('a','b','c'),(1.,2.,3.))))
a    1.0
b    2.0
c    3.0
dtype: float64

>>> pd.Series(dict(zip(('a','b','c'),(1,2,3))), index=['b', 'c', 'd', 'a'])
b    2.0
c    3.0
d    NaN
a    1.0
dtype: float64

注意: NaN(不是数字)是用于pandas的标准缺失数据标记
判断是否为nan

  • pd.isnull(s['d'])
    True
  • np.isnan(s['d'])
    True
  • import math
    math.isnan(s['d'])
    True

从标量值:如果data是标量值,则必须提供索引。该值会重复,来匹配索引的长度。

>>> pd.Series(data=3, index=range(5))
0    3
1    3
2    3
3    3
4    3
dtype: int64

Series 类似于 ndarray

>>>  s = pd.Series(np.random.randn(5), index=[chr(i) for i in range(97, 102)])
>>> s
a    1.762795
b    0.710000
c    1.372860
d    1.267486
e    0.141515
dtype: float64

>>> s[0]
1.762795268543718

>>> s[:3]
a    1.762795
b    0.710000
c    1.372860
dtype: float64

>>> s[s>s.median()]
a    1.762795
c    1.372860
dtype: float64

>>>s[[4,3,1]]
e    0.141515
d    1.267486
b    0.710000
dtype: float64

Series 类似于字典

Series就像一个固定大小的字典,您可以通过使用标签作为索引来获取和设置值:

>>> s['a']
1.762795268543718

>>> s['a'] = 1200
>>> s['f'] = 1200
>>> s

a    1200.000000
b       0.710000
c       1.372860
d       1.267486
e       0.141515
f    1200.000000
dtype: float64

>>> 'e' in s
True
>>> 'g' in s
False

如果标签不存在,则会出现异常:

>>> s['g']
KeyError: 'g'

使用get方法,缺失的标签将返回None或指定的默认值:

>>> s.get('g','不存在')
'不存在'

使用del方法,删除标签:

>>>  del s['f']
>>> s
a    1200.000000
b       0.710000
c       1.372860
d       1.267486
e       0.141515
dtype: float64

Series 的向量化操作和标签对齐

进行数据分析时,像原始NumPy数组一样,一个值一个值地循环遍历序列通常不是必需的。Series 也可以传递给大多数期望 ndarray 的 NumPy 方法。

>>> s+s
a    2400.000000
b       1.420001
c       2.745720
d       2.534972
e       0.283029
dtype: float64

>>> s*2
    2400.000000
b       1.420001
c       2.745720
d       2.534972
e       0.283029
dtype: float64

>>> np.exp(s)
a         inf
b    2.033992
c    3.946623
d    3.551912
e    1.152017
dtype: float64

Series 和 ndarray 之间的主要区别是,Series 上的操作会根据标签自动对齐数据。因此,您可以编写计算,而不考虑所涉及的 Series 是否具有相同标签。

>>>  s[1:] + s[:-1]
a         NaN
b    1.420001
c    2.745720
d    2.534972
e         NaN
dtype: float64

未对齐的 Series 之间的运算结果,将具有所涉及的索引的并集。如果在一个 Series或其他系列中找不到某个标签,则结果将标记为NaN(缺失)。编写代码而不进行任何显式的数据对齐的能力,在交互式数据分析和研究中提供了巨大的自由和灵活性。pandas数据结构所集成的数据对齐特性,将pandas与用于处理标记数据的大多数相关工具分开。

注意 一般来说,我们选择使索引不同的对象之间的操作的默认结果为union,来避免信息的丢失。尽管缺少数据,拥有索引标签通常是重要信息,作为计算的一部分。您当然可以通过dropna函数,选择丢弃带有缺失数据的标签。

>>> t = s[1:] + s[:-1]
>>> t.dropna()
b    1.420001
c    2.745720
d    2.534972
dtype: float64

名称属性

Series还可以具有name属性:

>>> series = pd.Series(np.random.randn(5), name='this is range')
>>> series
0    2.346803
1    0.073170
2   -0.940341
3    0.876354
4   -0.109891
Name: this is range, dtype: float64

可以使用pandas.Series.rename()方法来重命名 Series。

>>> series.rename(None)
0    2.346803
1    0.073170
2   -0.940341
3    0.876354
4   -0.109891
dtype: float64
>>> series.rename(lambda x: x ** 2) # 修改label
0     2.346803
1     0.073170
4    -0.940341
9     0.876354
16   -0.109891
Name: this is range, dtype: float64 
>>> series.rename({1:10,2:30}) # 修改label
0     2.346803
10    0.073170
30   -0.940341
3     0.876354
4    -0.109891
Name: this is range, dtype: float64

注意,不是修改的原对象,返回新的对象。

DataFrame(数据框架)

DataFrame是带有标签的二维数据结构,列的类型可能不同。你可以把它想象成一个电子表格或SQL表,或者Series对象的字典。它通常是最常用的pandas对象。像Series 一样,DataFrame 接受许多不同类型的输入:

  • 一维数组,列表,字典或 Series 的字典
  • 二维 numpy.ndarray
  • 结构化或记录 ndarray
  • Series
  • 另一个DataFrame

和数据一起,可以选择传递index(行标签)和columns(列标签)参数。如果传递索引或列,则会用于生成的DataFrame的索引或列。因此,Series 的字典加上特定索引将丢弃所有不匹配传入索引的数据。

如果轴标签未通过,则它们将基于常识规则从输入数据构造。
来自 Series 的字典

>>> d = {
    'one':pd.Series(list(range(1,4)), index=[chr(i) for i in range(97,100)]),
    'two':pd.Series(list(range(1,5)), index=[chr(i) for i in range(97,101)])
}

>>>  df = pd.DataFrame(d)
>>> df  
    one     two
a   1.0     1
b   2.0     2
c   3.0     3
d   NaN     4

>>> pd.DataFrame(d, index=['d','b','a'])
    one     two
d   NaN     4
b   2.0     2
a   1.0     1

>>> pd.DataFrame(d, index=['d','b','a'], columns=['two', 'three'])
    two three
d   4   NaN
b   2   NaN
a   1   NaN

通过访问indexcolumn属性可以分别访问行和列标签:

注意 同时传入一组特定的列和数据的字典时,传入的列将覆盖字典中的键。

>>> df.index
Index(['a', 'b', 'c', 'd'], dtype='object')
>>> df.colums
Index(['one', 'two'], dtype='object')

来自 ndarrays / lists 的字典

ndarrays 必须长度相同。如果传入了索引,它必须也与数组长度相同。如果没有传入索引,结果将是range(n),其中n是数组长度。

>>> d = {
    'one':list(range(1,5)),
    'two':list(range(1,5))[::-1]
}
>>> pd.DataFrame(d)
    one     two
0   1   4
1   2   3
2   3   2
3   4   1

>>> pd.DataFrame(d, index=[chr(i) for i in range(97,101)])
    one     two
a   1   4
b   2   3
c   3   2
d   4   1

来自 ndarrays / lists

>>> pd.DataFrame(np.arange(12).reshape(3,4))
    0   1   2   3
0   0   1   2   3
1   4   5   6   7
2   8   9   10  11

>>> pd.DataFrame(np.arange(12).reshape(3,4),index=[chr(i) for i in range(97,100)], columns=[chr(i) for i in range(97,101)])
    a   b   c   d
a   0   1   2   3
b   4   5   6   7
c   8   9   10  11
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容