<jupyter_start><jupyter_text>CHAPTER 5 Getting Started with pandas这一节终于要开始讲pandas了。闲话不说，直接开始正题。之后的笔记里，这样导入pandas：<jupyter_code>import pandas as pd<jupyter_output><empty_output><jupyter_text>另外可以导入Series和DataFrame，因为这两个经常被用到：<jupyter_code>from pandas import Series, DataFrame<jupyter_output><empty_output><jupyter_text>5.1 Introduction to pandas Data Structures数据结构其实就是Series和DataFrame。 1 Series这里series我就不翻译成序列了，因为之前的所有笔记里，我都是把sequence翻译成序列的。series是一个像数组一样的一维序列，并伴有一个数组表示label，叫做index。创建一个series的方法也很简单：<jupyter_code>obj = pd.Series([4, 7, -5, 3])
obj<jupyter_output><empty_output><jupyter_text>可以看到，左边表示index，右边表示对应的value。可以通过value和index属性查看：<jupyter_code>obj.values
obj.index # like range(4)<jupyter_output><empty_output><jupyter_text>当然我们也可以自己指定index的label：<jupyter_code>obj2 = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
obj2
obj2.index<jupyter_output><empty_output><jupyter_text>可以用index的label来选择：<jupyter_code>obj2['a']
obj2['d'] = 6
obj2[['c', 'a', 'd']]<jupyter_output><empty_output><jupyter_text>这里['c', 'a', 'd']其实被当做了索引，尽管这个索引是用string构成的。使用numpy函数或类似的操作，会保留index-value的关系：<jupyter_code>obj2[obj2 > 0]
obj2 * 2
import numpy as np
np.exp(obj2)<jupyter_output><empty_output><jupyter_text>另一种看待series的方法，它是一个长度固定，有顺序的dict，从index映射到value。在很多场景下，可以当做dict来用：<jupyter_code>'b' in obj2
'e' in obj2<jupyter_output><empty_output><jupyter_text>还可以直接用现有的dict来创建series：<jupyter_code>sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon':16000, 'Utah': 5000}
obj3 = pd.Series(sdata)
obj3<jupyter_output><empty_output><jupyter_text>series中的index其实就是dict中排好序的keys。我们也可以传入一个自己想要的顺序：<jupyter_code>states = ['California', 'Ohio', 'Oregon', 'Texas']
obj4 = pd.Series(sdata, index=states)
obj4<jupyter_output><empty_output><jupyter_text>顺序是按states里来的，但因为没有找到california,所以是NaN。NaN表示缺失数据，用之后我们提到的话就用missing或NA来指代。pandas中的isnull和notnull函数可以用来检测缺失数据：<jupyter_code>pd.isnull(obj4)
pd.notnull(obj4)<jupyter_output><empty_output><jupyter_text>series也有对应的方法：<jupyter_code>obj4.isnull()<jupyter_output><empty_output><jupyter_text>关于缺失数据，在第七章还会讲得更详细一些。series中一个有用的特色自动按index label来排序（Data alignment features）：<jupyter_code>obj3
obj4
obj3 + obj4<jupyter_output><empty_output><jupyter_text>这个Data alignment features（数据对齐特色）和数据库中的join相似。serice自身和它的index都有一个叫name的属性，这个能和其他pandas的函数进行整合：<jupyter_code>obj4.name = 'population'
obj4.index.name = 'state'
obj4<jupyter_output><empty_output><jupyter_text>series的index能被直接更改：<jupyter_code>obj
obj.index = ['Bob', 'Steve', 'Jeff', 'Ryan']
obj<jupyter_output><empty_output><jupyter_text>2 DataFrameDataFrame表示一个长方形表格，并包含排好序的列，每一列都可以是不同的数值类型（数字，字符串，布尔值）。DataFrame有行索引和列索引（row index, column index）；可以看做是分享所有索引的由series组成的字典。数据是保存在一维以上的区块里的。（其实我是把dataframe当做excel里的那种表格来用的，这样感觉更直观一些）构建一个dataframe的方法，用一个dcit，dict里的值是list：<jupyter_code>data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'], 
        'year': [2000, 2001, 2002, 2001, 2002, 2003], 
        'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}

frame = pd.DataFrame(data)

frame<jupyter_output><empty_output><jupyter_text>dataframe也会像series一样，自动给数据赋index, 而列则会按顺序排好。对于一个较大的DataFrame，用head方法会返回前5行（注：这个函数在数据分析中经常使用，用来查看表格里有什么东西）：<jupyter_code>frame.head()<jupyter_output><empty_output><jupyter_text>如果指定一列的话，会自动按列排序：<jupyter_code>pd.DataFrame(data, columns=['year', 'state', 'pop'])<jupyter_output><empty_output><jupyter_text>如果你导入一个不存在的列名，那么会显示为缺失数据：<jupyter_code>frame2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'], 
                      index=['one', 'two', 'three', 'four', 'five', 'six'])
frame2
frame2.columns<jupyter_output><empty_output><jupyter_text>从DataFrame里提取一列的话会返回series格式，可以以属性或是dict一样的形式来提取：<jupyter_code>frame2['state']
frame2.year<jupyter_output><empty_output><jupyter_text>注意：frame2[column]能应对任何列名，但frame2.column的情况下，列名必须是有效的python变量名才行。返回的series有DataFrame种同样的index，而且name属性也是对应的。对于行，要用在loc属性里用 位置或名字：<jupyter_code>frame2.loc['three']<jupyter_output><empty_output><jupyter_text>列值也能通过赋值改变。比如给debt赋值：<jupyter_code>frame2['debt'] = 16.5
frame2
frame2['debt'] = np.arange(6.)
frame2<jupyter_output><empty_output><jupyter_text>如果把list或array赋给column的话，长度必须符合DataFrame的长度。如果把一二series赋给DataFrame，会按DataFrame的index来赋值，不够的地方用缺失数据来表示：<jupyter_code>val = pd.Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])
frame2['debt'] = val
frame2<jupyter_output><empty_output><jupyter_text>如果列不存在，赋值会创建一个新列。而del也能像删除字典关键字一样，删除列：<jupyter_code>frame2['eastern'] = frame2.state == 'Ohio'
frame2<jupyter_output><empty_output><jupyter_text>然后用del删除这一列：<jupyter_code>del frame2['eastern']
frame2.columns<jupyter_output><empty_output><jupyter_text>注意：columns返回的是一个view，而不是新建了一个copy。因此，任何对series的改变，会反映在DataFrame上。除非我们用copy方法来新建一个。另一种常见的格式是dict中的dict：<jupyter_code>pop = {'Nevada': {2001: 2.4, 2002: 2.9},
       'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}<jupyter_output><empty_output><jupyter_text>把上面这种嵌套dcit传给DataFrame，pandas会把外层dcit的key当做列，内层key当做行索引：<jupyter_code>frame3 = pd.DataFrame(pop)
frame3<jupyter_output><empty_output><jupyter_text>另外DataFrame也可以向numpy数组一样做转置：<jupyter_code>frame3.T<jupyter_output><empty_output><jupyter_text>指定index：<jupyter_code>pd.DataFrame(pop, index=[2001, 2002, 2003])<jupyter_output><empty_output><jupyter_text>series组成的dict：<jupyter_code>pdata = {'Ohio': frame3['Ohio'][:-1],
         'Nevada': frame3['Nevada'][:2]}
pd.DataFrame(pdata)<jupyter_output><empty_output><jupyter_text>其他一些可以传递给DataFrame的构造器：![](http://oydgk2hgw.bkt.clouddn.com/pydata-book/yv7rc.png)如果DataFrame的index和column有自己的name属性，也会被显示：<jupyter_code>frame3.index.name = 'year'; frame3.columns.name = 'state'
frame3<jupyter_output><empty_output><jupyter_text>values属性会返回二维数组：<jupyter_code>frame3.values<jupyter_output><empty_output><jupyter_text>如果column有不同的类型，dtype会适应所有的列：<jupyter_code>frame2.values<jupyter_output><empty_output><jupyter_text>3 Index Objects (索引对象)pandas的Index Objects (索引对象)负责保存axis labels和其他一些数据（比如axis name或names）。一个数组或其他一个序列标签，只要被用来做构建series或DataFrame，就会被自动转变为index：<jupyter_code>obj = pd.Series(range(3), index=['a', 'b', 'c'])
index = obj.index
index
index[1:]<jupyter_output><empty_output><jupyter_text>index object是不可更改的：<jupyter_code>index[1] = 'd'<jupyter_output><empty_output><jupyter_text>正因为不可修改，所以data structure中分享index object是很安全的：<jupyter_code>labels = pd.Index(np.arange(3))
labels
obj2 = pd.Series([1.5, -2.5, 0], index=labels)
obj2
obj2.index is labels<jupyter_output><empty_output><jupyter_text>index除了想数组，还能像大小一定的set：<jupyter_code>frame3
frame3.columns
'Ohio' in frame3.columns
2003 in frame3.columns<jupyter_output><empty_output><jupyter_text>与python里的set不同，pandas的index可以有重复的labels：<jupyter_code>dup_labels = pd.Index(['foo', 'foo', 'bar', 'bar'])
dup_labels<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.14606572203798612, 'fraction_numerical': 0.0309014169430208, 'mean_word_length': 15.382716049382717, 'pattern_counts': {'":': 0, '<': 153, '<?xml version=': 0, '>': 154, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '38', 'dir': 'jupyter-structured-clean-dedup', 'id': '44256', 'license': 'MIT', 'n_tokens_mistral': 3482, 'n_tokens_neox': 3528, 'n_words': 229, 'path': 'Chapter-05/5.1 Introduction to pandas Data Structures（pandas的数据结构）.ipynb', 'repo_name': 'hu4012/pydata', 'size': '6634'}