pandas基本结构如下:
2.1 头部尾部取样 要查看Series或DataFrame对象的头部尾部样本,可以使用head()和tail()方法。 默认显示的元素是五个,但可以传递自定义数字。
In [3]: seriesd = pd.Series(np.random.randn(100)) In [4]: seriesd.head() 0 1.894425 1 0.804395 2 -1.511387 3 0.195662 4 -0.053392 dtype: float64 In [5]: seriesd.head(3) 0 1.894425 1 0.804395 2 -1.511387 dtype: float64
2.2 属性调用 pandas对象有很多属性,可以访问元数据:
shape : 给出对象的轴维度,与ndarray一致 Series: index DataFrame: index、columns、values Panel: items, major_axis, and minor_axis 这些属性都可以安全的进行再分配。 In [6]: df = pd.DataFrame(np.random.randn(4,3),index=pd.date_range('1/1/2000',periods=4),columns=['A','B','C']) In [8]: df A B C 2000-01-01 1.748549 -0.766845 0.592976 2000-01-02 -0.821119 -0.122719 0.055415 2000-01-03 1.146029 1.615741 -1.115166 2000-01-04 0.947920 0.181372 0.190599 In [9]: df.columns Out[9]: Index([u'A', u'B', u'C'], dtype='object')
In [10]: df.index Out[10]: DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-03', '2000-01-04'], dtype='datetime64[ns]', freq='D')
In [11]: df.values array([[ 1.74854937, -0.76684475, 0.59297559], [-0.82111911, -0.12271889, 0.05541523], [ 1.14602866, 1.61574067, -1.1151657 ], [ 0.9479203 , 0.18137236, 0.19059879]]) 2.3.1 匹配/广播行为 DataFrame有add()、sub()、mul()、div()以及相对的radd(), rsub()...等四则运算函数,使用这些函数式,可以通过指定axis参数为index或columns进行广播匹配。
In [13]: df.sub(df.ix[1],axis='columns') A B C 2000-01-01 2.569668 -0.644126 0.537560 2000-01-02 0.000000 0.000000 0.000000 2000-01-03 1.967148 1.738460 -1.170581 2000-01-04 1.769039 0.304091 0.135184
In [14]: df.sub(df.ix[1],axis=1) A B C 2000-01-01 2.569668 -0.644126 0.537560 2000-01-02 0.000000 0.000000 0.000000 2000-01-03 1.967148 1.738460 -1.170581 2000-01-04 1.769039 0.304091 0.135184
In [15]: df.sub(df.ix[1],axis='index') A B C 2000-01-01 00:00:00 NaN NaN NaN 2000-01-02 00:00:00 NaN NaN NaN 2000-01-03 00:00:00 NaN NaN NaN 2000-01-04 00:00:00 NaN NaN NaN A NaN NaN NaN B NaN NaN NaN C NaN NaN NaN
In [16]: df.sub(df.ix[1],axis=0)
A B C
2000-01-01 00:00:00 NaN NaN NaN
2000-01-02 00:00:00 NaN NaN NaN
2000-01-03 00:00:00 NaN NaN NaN
2000-01-04 00:00:00 NaN NaN NaN
A NaN NaN NaN
B NaN NaN NaN
C NaN NaN NaN
#MultiIndex上指定level控制广播行为
In [17]: dfmi = df.copy()
In [18]: dfmi.index = pd.MultiIndex.from_tuples([(1,'a'),(1,'b'),(1,'c'),(2,'a')],names=['first','second'])
In [19]: dfmi
Out[19]:
A B C
first second
1 a 1.748549 -0.766845 0.592976
b -0.821119 -0.122719 0.055415
c 1.146029 1.615741 -1.115166
2 a 0.947920 0.181372 0.190599
In [20]: dfmi.sub(df['A'],axis=0,level='second')
Out[20]:
A B C
first second
1 a NaN NaN NaN
b NaN NaN NaN
c NaN NaN NaN
2 a NaN NaN NaN
#Panel的算术运算广播控制与DataFrame类似,设置axis = 'major'/'minor'/'items'
Panel.sub(major_mean, axis='major')
2.3.2 缺失数据的值填充
在Series和DataFrame(虽然还没有在面板中),算术函数可以选择输入fill_value,即当位置上的值丢失时替换的值。例如,当对两个DataFrame对象做加法时,您可能希望将NaN视为0,除非两个DataFrames都缺少该值。
In [54]: df1 A B C 2000-01-01 1.748549 NaN 0.592976 2000-01-02 -0.821119 -0.122719 0.055415 2000-01-03 1.146029 1.615741 -1.115166 2000-01-04 3.214000 0.181372 0.190599
In [55]: df2 A B C 2000-01-01 1.748549 3.241000 0.592976 2000-01-02 -0.821119 -0.122719 0.055415 2000-01-03 1.146029 1.615741 -1.115166 2000-01-04 NaN 0.181372 0.190599
In [56]: df1+df2 A B C 2000-01-01 3.497099 NaN 1.185951 2000-01-02 -1.642238 -0.245438 0.110830 2000-01-03 2.292057 3.231481 -2.230331 2000-01-04 NaN 0.362745 0.381198
In [57]: df1.add(df2,fill_value=0) A B C 2000-01-01 3.497099 3.241000 1.185951 2000-01-02 -1.642238 -0.245438 0.110830 2000-01-03 2.292057 3.231481 -2.230331 2000-01-04 3.214000 0.362745 0.381198 2.3.3组合重叠数据集 比如希望组合两个DataFrame对象,其中一个DataFrame中的缺失值有条件地从其他DataFrame填充类似标签的值,可以使用combine_first():
In [63]: df1 = pd.DataFrame({'A' : [1., np.nan, 3., 5., np.nan],'B' : [np.nan, 2., 3., np.nan, 6.]}) In [64]: df2 = pd.DataFrame({'A' : [5., 2., 4., np.nan, 3., 7.],'B' : [np.nan, np.nan, 3., 4., 6., 8.]}) In [65]: df1 A B 0 1.0 NaN 1 NaN 2.0 2 3.0 3.0 3 5.0 NaN 4 NaN 6.0 In [66]: df2 A B 0 5.0 NaN 1 2.0 NaN 2 4.0 3.0 3 NaN 4.0 4 3.0 6.0 5 7.0 8.0 In [67]: df1.combine_first(df2) A B 0 1.0 NaN 1 2.0 2.0 2 3.0 3.0 3 5.0 4.0 4 3.0 6.0 5 7.0 8.0 普通的combine()函数采用另一个DataFrame和组合器函数,对齐输入的DataFrame,然后传递组合器函数成对的Series:
In [75]: combiner = lambda x, y: np.where(pd.isnull(x), y, x) In [76]: df1.combine(df2, combiner) A B 0 1.0 NaN 1 2.0 2.0 2 3.0 3.0 3 5.0 4.0 4 3.0 6.0 5 7.0 8.0 2.4 描述统计 有很多用于做描述统计的函数用于Series、DataFrame、Panel。大部分是聚合类函数:sum(),mean(),std(),quantile()等。其中有一些会返回一个同样大小的对象:cumsum() ,cumprod()。一般来说,这些函数包含axis参数,可以传入名称或整数:
Series: 没有axis参数; DataFrame: “index” (axis=0, default), “columns” (axis=1) Panel: “items” (axis=0), “major” (axis=1, default), “minor” (axis=2) 所有这些函数都包含一个skipna参数,用于确定是否要跳过空值。
In [80]: df.sum(0, skipna=False) 2.4.1 汇总统计describe() 经常用到的汇总数据函数describe(),返回一系列的汇总统计项数据
In [96]: frame = pd.DataFrame(np.random.randn(1000, 5), columns=['a', 'b', 'c', 'd',‘e'] In [98]: frame.describe() 该函数可以指定percentiles参数,生成想要的百分比统计:
In [99]: series.describe(percentiles=[.05, .25, .75, .95]) count 500.000000 mean -0.039663 std 1.069371 min -3.463789 5% -1.741334 25% -0.731101 50% -0.058918 75% 0.672758 95% 1.854383 max 3.120271 2.4.2 Index的最小最大值计算 函数idxmin() 、 idxmax() 用于计算index的最小值或最大值。当有多个值满足最小或最大值时,返回最先匹配到的那一个值。
2.4.3 值统计 value_counts()用于统计相同值的汇总计数。
In [3]: data = np.random.randint(0, 7, size=50)
In [4]: pd.value_counts(data) Out[4]: 6 11 5 8 3 8 0 8 4 7 2 5 1 3 dtype: int64 使用mode()函数可以获取出现最频繁的值统计:
In [5]: df5 = pd.DataFrame({"A": np.random.randint(0, 7, size=50),"B": np.random.randint(-10, 15, size=50)})
In [6]: df5.mode() Out[6]: A B 0 0.0 7 1 NaN 10 2.4.4 离散化与量化 连续值可以使用函数cut() (基于值的边界)和qcut()( 基于样本分位数的边界)进行离散化:
In [11]: arr = np.random.randn(20)
In [12]: factor = pd.cut(arr,4)
In [13]: factor Out[13]: [(-0.34, 0.49], (0.49, 1.32], (-0.34, 0.49], (-1.169, -0.34], (-2.00224, -1.169], ..., (-1.169, -0.34], (-2.00224, -1.169], (0.49, 1.32], (-0.34, 0.49], (-1.169, -0.34]] Length: 20 Categories (4, object): [(-2.00224, -1.169] < (-1.169, -0.34] < (-0.34, 0.49] < (0.49, 1.32]] qcut()计算样本分位数。 例如,我们可以将一些正态分布的数据分成等大小四分位数
In [8]: arr = np.random.randn(30)
In [9]: factor = pd.qcut(arr, [0, .25, .5, .75, 1])
In [10]: factor Out[10]: [(-0.471, 0.0742], (-0.471, 0.0742], (0.0742, 0.797], (0.797, 2.597], [-2.735, -0.471], ..., [-2.735, -0.471], [-2.735, -0.471], (0.797, 2.597], [-2.735, -0.471], (0.0742, 0.797]] Length: 30 Categories (4, object): [[-2.735, -0.471] < (-0.471, 0.0742] < (0.0742, 0.797] < (0.797, 2.597]] 个人感觉这个用处不大,太小了
2.5 函数应用 为了对pandas应用自定义或其他的外在函数,可使用以下三种方法,使用的适当方法取决于函数是否期望在整个Series或DataFrame上操作,行或列方式、元素方式:
表格函数应用: pipe() 行或列方式函数应用:apply() 元素函数应用:applymap() 2.5.1 表格函数应用 pipe() 如果要在pandas中进行函数链式调用,建议使用pipe()
(df.pipe(h).pipe(g, arg1=1).pipe(f, arg2=2, arg3=3) 2.5.2 行或列方式函数应用:apply() 可以使用apply()方法沿着DataFrame或Panel的轴应用任意函数,例如描述性统计方法,采用可选的轴参数:
df.apply(np.mean, axis=1) 2.6 重新索引和更改标签 reindex()是pandas中的基本数据对齐方法。它用于实现依赖于标签对齐功能的几乎所有其他功能。重新索引意味着使数据符合给定的一组标签和特定轴。 这完成了几件事:
重新排序现有数据以匹配给定的新标签 在没有该标签的数据标签位置插入NA 如果指定,使用逻辑(与使用时间序列数据高度相关)填写缺少标签的数据 In [3]: s = pd.Series(np.random.randn(5),index=['a','b','c','d','e']) In [4]: s a 0.763208 b -0.328499 c -0.233119 d 1.874552 e -0.937831 dtype: float64
In [5]: s.reindex(['e','b','f','d']) e -0.937831 b -0.328499 f NaN d 1.874552 dtype: float64 2.6.1 重新索引以与另一个对象对齐 您可能希望获取一个对象,并将其轴重命名为与另一个对象相同的标签,使用reindex_like():
In [188]: df.reindex_like(df2) 2.6.2 对齐操作使对象彼此对齐 align()方法是同时对齐两个对象的最快方法。 它支持参数join:
join ='outer':获取索引的并集(默认) join ='left':使用调用对象的索引 join ='right':使用传递的对象的索引 join ='inner':使用索引的交集 对于DataFrames,默认情况下,join方法将应用于索引和列,也可以通过axis指定仅在指定轴上对齐,如axis=0或axis=1。 In [196]: df.align(df2, join='inner', axis=0) 2.6.3 从轴中删除标签 drop()从轴删除一组标签:
In [212]: df.drop(['one'], axis=1) 2.6.4重命名/映射标签 rename()允许您根据一些映射(一个字典或系列)或任意函数重新标记一个轴:
In [215]: s.rename(str.upper) In [216]: df.rename(columns={'one' : 'foo', 'two' : 'bar'},index={'a' : 'apple', 'b' : 'banana', 'd' : 'durian'}) 2.7 迭代 对pandas对象的基本迭代行为取决于类型。基本迭代(for i in object)产生:
Series : values DataFrame : column labels Panel: item labels Pandas对象也有类似dict的iteritems()方法来遍历(key,value)对。 要遍历DataFrame的行,可以使用以下方法: iterrows(): 在DataFrame的行上迭代成(index,Series)对。 这将行转换为Series对象,这可以改变dtypes和具有一些性能影响。 itertuples(): 将DataFrame的行作为值的namedtuples进行迭代。 这是一个比iterrows()快得多,并且在大多数情况下更适合用于遍历DataFrame的值 In [220]: df = pd.DataFrame({'a': [1, 2, 3], 'b': ['a', 'b', 'c']}) In [221]: for index, row in df.iterrows(): row['a'] = 10 其他的没什么用了
2.8 排序 根据Index进行排序 排序轴标签(索引)的主要方法是Series.sort_index()和DataFrame.sort_index(): 很据Values进行排序 Series.sort_values()和DataFrame.sort_values()。 DataFrame.sort_values()可以接受by参数和axis = 0的参数,它将使用DataFrame的任意向量或列名来确定排序顺序: In [3]: df1 = pd.DataFrame({'one':[2,1,1,1],'two':[1,3,2,4],'three':[5,4,3,2]}) In [4]: df1.sort_values(by='two') one three two 0 2 5 1 2 1 3 2 1 1 4 3 3 1 2 4 2.9 Dtypes 存储在pandas对象中的主要类型是float,int,bool,datetime64 [ns]和datetime64 [ns,tz],timedelta [ns],categories和object。 此外,这些Dtypes具有项大小,例如 int64和int32。
Data Frames的dtypes属性返回一个具有每列数据类型的Series。
In [17]: df.dtypes Out[17]: a int64 b object c float64 dtype: object
In [18]: df['a'].dtype Out[18]: dtype('int64') pandas的作用主要是初步认识数据,以及初步的清洗数据仅此而已,在数据挖掘中的作用不可高估,另外python用来做数据清洗不够灵活天生有缺陷,远不如java,scala方便