Environment

  • pandas 0.21.0
  • python 3.6
  • jupyter notebook

开始

习惯上,我们导入如下:

  1. import pandas as pd
  2. import numpy as np
  3. import matplotlib.pyplot as plt

对象创建

具体参阅数据结构介绍
通过传递一个值列表来创建一个 Series,让 pandas 创建一个默认的整数索引:

  1. In [4]: s = pd.Series([1,3,5,np.nan,6,8])
  2.  
  3. In [5]: s
  4. Out[5]:
  5. 0 1.0
  6. 1 3.0
  7. 2 5.0
  8. 3 NaN
  9. 4 6.0
  10. 5 8.0
  11. dtype: float64

通过传递具有日期时间索引和标签列的 numpy 数组来创建一个 DataFrame:

  1. In [6]: dates = pd.date_range('20130101', periods=6)
  2.  
  3. In [7]: dates
  4. Out[7]:
  5. DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
  6. '2013-01-05', '2013-01-06'],
  7. dtype='datetime64[ns]', freq='D')
  8.  
  9. In [8]: df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
  10.  
  11. In [9]: df
  12. Out[9]:
  13. A B C D
  14. 2013-01-01 0.469112 -0.282863 -1.509059 -1.135632
  15. 2013-01-02 1.212112 -0.173215 0.119209 -1.044236
  16. 2013-01-03 -0.861849 -2.104569 -0.494929 1.071804
  17. 2013-01-04 0.721555 -0.706771 -1.039575 0.271860
  18. 2013-01-05 -0.424972 0.567020 0.276232 -1.087401
  19. 2013-01-06 -0.673690 0.113648 -1.478427 0.524988

通过传递一个可以转换为一系列对象的字典来创建一个 DataFrame。

  1. In [10]: df2 = pd.DataFrame({ 'A' : 1.,
  2. ....: 'B' : pd.Timestamp('20130102'),
  3. ....: 'C' : pd.Series(1,index=list(range(4)),dtype='float32'),
  4. ....: 'D' : np.array([3] * 4,dtype='int32'),
  5. ....: 'E' : pd.Categorical(["test","train","test","train"]),
  6. ....: 'F' : 'foo' })
  7. ....:
  8.  
  9. In [11]: df2
  10. Out[11]:
  11. A B C D E F
  12. 0 1.0 2013-01-02 1.0 3 test foo
  13. 1 1.0 2013-01-02 1.0 3 train foo
  14. 2 1.0 2013-01-02 1.0 3 test foo
  15. 3 1.0 2013-01-02 1.0 3 train foo

有特定的 dtypes

  1. In [12]: df2.dtypes
  2. Out[12]:
  3. A float64
  4. B datetime64[ns]
  5. C float32
  6. D int32
  7. E category
  8. F object
  9. dtype: object

如果您使用 IPython,按下 TAB 将提示补全。以下是将要完成的属性的子集:

  1. In [13]: df2.<TAB>
  2. df2.A df2.bool
  3. df2.abs df2.boxplot
  4. df2.add df2.C
  5. df2.add_prefix df2.clip
  6. df2.add_suffix df2.clip_lower
  7. df2.align df2.clip_upper
  8. df2.all df2.columns
  9. df2.any df2.combine
  10. df2.append df2.combine_first
  11. df2.apply df2.compound
  12. df2.applymap df2.consolidate
  13. df2.D

如您所见,列 A,B,C 和 D 自动完成。 E 也在那里;为了简洁,其余的属性被省略。

查看数据

具体参阅基本部分(http://pandas.pydata.org/pandas-docs/stable/basics.html#basics
查看数据集中的最开始和最末尾的行

  1. In [14]: df.head()
  2. Out[14]:
  3. A B C D
  4. 2013-01-01 0.469112 -0.282863 -1.509059 -1.135632
  5. 2013-01-02 1.212112 -0.173215 0.119209 -1.044236
  6. 2013-01-03 -0.861849 -2.104569 -0.494929 1.071804
  7. 2013-01-04 0.721555 -0.706771 -1.039575 0.271860
  8. 2013-01-05 -0.424972 0.567020 0.276232 -1.087401
  9.  
  10. In [15]: df.tail(3)
  11. Out[15]:
  12. A B C D
  13. 2013-01-04 0.721555 -0.706771 -1.039575 0.271860
  14. 2013-01-05 -0.424972 0.567020 0.276232 -1.087401
  15. 2013-01-06 -0.673690 0.113648 -1.478427 0.524988

显示索引,列和底层 numpy 数据

  1. In [16]: df.index
  2. Out[16]:
  3. DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
  4. '2013-01-05', '2013-01-06'],
  5. dtype='datetime64[ns]', freq='D')
  6.  
  7. In [17]: df.columns
  8. Out[17]: Index(['A', 'B', 'C', 'D'], dtype='object')
  9.  
  10. In [18]: df.values
  11. Out[18]:
  12. array([[ 0.4691, -0.2829, -1.5091, -1.1356],
  13. [ 1.2121, -0.1732, 0.1192, -1.0442],
  14. [-0.8618, -2.1046, -0.4949, 1.0718],
  15. [ 0.7216, -0.7068, -1.0396, 0.2719],
  16. [-0.425 , 0.567 , 0.2762, -1.0874],
  17. [-0.6737, 0.1136, -1.4784, 0.525 ]])

描述显示您的数据的快速统计结果( std 是标准偏差)

  1. In [19]: df.describe()
  2. Out[19]:
  3. A B C D
  4. count 6.000000 6.000000 6.000000 6.000000
  5. mean 0.073711 -0.431125 -0.687758 -0.233103
  6. std 0.843157 0.922818 0.779887 0.973118
  7. min -0.861849 -2.104569 -1.509059 -1.135632
  8. 25% -0.611510 -0.600794 -1.368714 -1.076610
  9. 50% 0.022070 -0.228039 -0.767252 -0.386188
  10. 75% 0.658444 0.041933 -0.034326 0.461706
  11. max 1.212112 0.567020 0.276232 1.071804

转置数据

  1. In [20]: df.T
  2. Out[20]:
  3. 2013-01-01 2013-01-02 2013-01-03 2013-01-04 2013-01-05 2013-01-06
  4. A 0.469112 1.212112 -0.861849 0.721555 -0.424972 -0.673690
  5. B -0.282863 -0.173215 -2.104569 -0.706771 0.567020 0.113648
  6. C -1.509059 0.119209 -0.494929 -1.039575 0.276232 -1.478427
  7. D -1.135632 -1.044236 1.071804 0.271860 -1.087401 0.524988

按轴排序

  1. In [21]: df.sort_index(axis=1, ascending=False)
  2. Out[21]:
  3. D C B A
  4. 2013-01-01 -1.135632 -1.509059 -0.282863 0.469112
  5. 2013-01-02 -1.044236 0.119209 -0.173215 1.212112
  6. 2013-01-03 1.071804 -0.494929 -2.104569 -0.861849
  7. 2013-01-04 0.271860 -1.039575 -0.706771 0.721555
  8. 2013-01-05 -1.087401 0.276232 0.567020 -0.424972
  9. 2013-01-06 0.524988 -1.478427 0.113648 -0.673690

按值排序

  1. In [22]: df.sort_values(by='B')
  2. Out[22]:
  3. A B C D
  4. 2013-01-03 -0.861849 -2.104569 -0.494929 1.071804
  5. 2013-01-04 0.721555 -0.706771 -1.039575 0.271860
  6. 2013-01-01 0.469112 -0.282863 -1.509059 -1.135632
  7. 2013-01-02 1.212112 -0.173215 0.119209 -1.044236
  8. 2013-01-06 -0.673690 0.113648 -1.478427 0.524988
  9. 2013-01-05 -0.424972 0.567020 0.276232 -1.087401

选择

请参阅索引文档索引和选择数据(http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing)和多索引/高级索引(http://pandas.pydata.org/pandas-docs/stable/advanced.html#advanced

直接选择

选择一个产生 Series 的列,相当于 df.A

  1. In [23]: df['A']
  2. Out[23]:
  3. 2013-01-01 0.469112
  4. 2013-01-02 1.212112
  5. 2013-01-03 -0.861849
  6. 2013-01-04 0.721555
  7. 2013-01-05 -0.424972
  8. 2013-01-06 -0.673690
  9. Freq: D, Name: A, dtype: float64

 

选择通过 [] ,哪些切片的行。

  1. In [24]: df[0:3]
  2. Out[24]:
  3. A B C D
  4. 2013-01-01 0.469112 -0.282863 -1.509059 -1.135632
  5. 2013-01-02 1.212112 -0.173215 0.119209 -1.044236
  6. 2013-01-03 -0.861849 -2.104569 -0.494929 1.071804
  7.  
  8. In [25]: df['20130102':'20130104']
  9. Out[25]:
  10. A B C D
  11. 2013-01-02 1.212112 -0.173215 0.119209 -1.044236
  12. 2013-01-03 -0.861849 -2.104569 -0.494929 1.071804
  13. 2013-01-04 0.721555 -0.706771 -1.039575 0.271860

按标签选择

请参阅按标签选择(http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-label
使用标签获取整行数据

1
2
3
4
5
6
7
In [26]: df.loc[dates[0]]
Out[26]:
A    0.469112
B  -0.282863
C  -1.509059
D  -1.135632
Name: 2013-01-01 00:00:00, dtype: float64

 

通过标签选择多列

  1. In [27]: df.loc[:,['A','B']]
  2. Out[27]:
  3. A B
  4. 2013-01-01 0.469112 -0.282863
  5. 2013-01-02 1.212112 -0.173215
  6. 2013-01-03 -0.861849 -2.104569
  7. 2013-01-04 0.721555 -0.706771
  8. 2013-01-05 -0.424972 0.567020
  9. 2013-01-06 -0.673690 0.113648

显示标签切片,包括两个端点

  1. In [29]: df.loc['20130102',['A','B']]
  2. Out[29]:
  3. A 1.212112
  4. B -0.173215
  5. Name: 2013-01-02 00:00:00, dtype: float64

减少返回的对象的维度

  1. In [29]: df.loc['20130102',['A','B']]
  2. Out[29]:
  3. A 1.212112
  4. B -0.173215
  5. Name: 2013-01-02 00:00:00, dtype: float64

获得标量值

  1. In [30]: df.loc[dates[0],'A']
  2. Out[30]: 0.46911229990718628
  3. 快速访问标量(等同于之前的方法)
  4. In [31]: df.at[dates[0],'A']
  5. Out[31]: 0.46911229990718628

按位置选择

请参阅按位置选择(http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-integer
通过传入整数的位置进行选择

  1. In [32]: df.iloc[3]
  2. Out[32]:
  3. A 0.721555
  4. B -0.706771
  5. C -1.039575
  6. D 0.271860
  7. Name: 2013-01-04 00:00:00, dtype: float64

通过整数片,类似于 numpy / python

  1. In [33]: df.iloc[3:5,0:2]
  2. Out[33]:
  3. A B
  4. 2013-01-04 0.721555 -0.706771
  5. 2013-01-05 -0.424972 0.567020

整数位置的位置列表,类似于 numpy / python 风格

  1. In [34]: df.iloc[[1,2,4],[0,2]]
  2. Out[34]:
  3. A C
  4. 2013-01-02 1.212112 0.119209
  5. 2013-01-03 -0.861849 -0.494929
  6. 2013-01-05 -0.424972 0.276232

用于明确地切割行

  1. In [35]: df.iloc[1:3,:]
  2. Out[35]:
  3. A B C D
  4. 2013-01-02 1.212112 -0.173215 0.119209 -1.044236
  5. 2013-01-03 -0.861849 -2.104569 -0.494929 1.071804

用于明确地切分列

  1. In [36]: df.iloc[:,1:3]
  2. Out[36]:
  3. B C
  4. 2013-01-01 -0.282863 -1.509059
  5. 2013-01-02 -0.173215 0.119209
  6. 2013-01-03 -2.104569 -0.494929
  7. 2013-01-04 -0.706771 -1.039575
  8. 2013-01-05 0.567020 0.276232
  9. 2013-01-06 0.113648 -1.478427

为了明确地获取一个值

  1. In [37]: df.iloc[1,1]
  2. Out[37]: -0.17321464905330858

为了快速访问标量(等同于之前的方法)

  1. In [38]: df.iat[1,1]
  2. Out[38]: -0.17321464905330858

布尔索引

使用单个列的值来选择数据。

  1. In [39]: df[df.A > 0]
  2. Out[39]:
  3. A B C D
  4. 2013-01-01 0.469112 -0.282863 -1.509059 -1.135632
  5. 2013-01-02 1.212112 -0.173215 0.119209 -1.044236
  6. 2013-01-04 0.721555 -0.706771 -1.039575 0.271860

从满足布尔条件的 DataFrame 中选择值。

  1. In [40]: df[df > 0]
  2. Out[40]:
  3. A B C D
  4. 2013-01-01 0.469112 NaN NaN NaN
  5. 2013-01-02 1.212112 NaN 0.119209 NaN
  6. 2013-01-03 NaN NaN NaN 1.071804
  7. 2013-01-04 0.721555 NaN NaN 0.271860
  8. 2013-01-05 NaN 0.567020 0.276232 NaN
  9. 2013-01-06 NaN 0.113648 NaN 0.524988

使用 isin()方法进行过滤:

  1. In [41]: df2 = df.copy()
  2.  
  3. In [42]: df2['E'] = ['one', 'one','two','three','four','three']
  4.  
  5. In [43]: df2
  6. Out[43]:
  7. A B C D E
  8. 2013-01-01 0.469112 -0.282863 -1.509059 -1.135632 one
  9. 2013-01-02 1.212112 -0.173215 0.119209 -1.044236 one
  10. 2013-01-03 -0.861849 -2.104569 -0.494929 1.071804 two
  11. 2013-01-04 0.721555 -0.706771 -1.039575 0.271860 three
  12. 2013-01-05 -0.424972 0.567020 0.276232 -1.087401 four
  13. 2013-01-06 -0.673690 0.113648 -1.478427 0.524988 three
  14.  
  15. In [44]: df2[df2['E'].isin(['two','four'])]
  16. Out[44]:
  17. A B C D E
  18. 2013-01-03 -0.861849 -2.104569 -0.494929 1.071804 two
  19. 2013-01-05 -0.424972 0.567020 0.276232 -1.087401 four

设置

设置新列自动按索引排列数据

  1. In [45]: s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130102', periods=6))
  2.  
  3. In [46]: s1
  4. Out[46]:
  5. 2013-01-02 1
  6. 2013-01-03 2
  7. 2013-01-04 3
  8. 2013-01-05 4
  9. 2013-01-06 5
  10. 2013-01-07 6
  11. Freq: D, dtype: int64
  12.  
  13. In [47]: df['F'] = s1

通过标签设置值

  1. In [48]: df.at[dates[0],'A'] = 0

按位置设置值

  1. In [49]: df.iat[0,1] = 0

通过分配一个 numpy 数组进行设置

  1. In [50]: df.loc[:,'D'] = np.array([5] * len(df))

事先设置操作的结果

  1. In [51]: df
  2. Out[51]:
  3. A B C D F
  4. 2013-01-01 0.000000 0.000000 -1.509059 5 NaN
  5. 2013-01-02 1.212112 -0.173215 0.119209 5 1.0
  6. 2013-01-03 -0.861849 -2.104569 -0.494929 5 2.0
  7. 2013-01-04 0.721555 -0.706771 -1.039575 5 3.0
  8. 2013-01-05 -0.424972 0.567020 0.276232 5 4.0
  9. 2013-01-06 -0.673690 0.113648 -1.478427 5 5.0

一个 where 操作与设置。

  1. In [52]: df2 = df.copy()
  2.  
  3. In [53]: df2[df2 > 0] = -df2
  4.  
  5. In [54]: df2
  6. Out[54]:
  7. A B C D F
  8. 2013-01-01 0.000000 0.000000 -1.509059 -5 NaN
  9. 2013-01-02 -1.212112 -0.173215 -0.119209 -5 -1.0
  10. 2013-01-03 -0.861849 -2.104569 -0.494929 -5 -2.0
  11. 2013-01-04 -0.721555 -0.706771 -1.039575 -5 -3.0
  12. 2013-01-05 -0.424972 -0.567020 -0.276232 -5 -4.0
  13. 2013-01-06 -0.673690 -0.113648 -1.478427 -5 -5.0

缺失数据

熊猫主要使用值 np.nan 来表示缺失的数据。这是默认情况下不包括在计算中。查看缺失数据(http://pandas.pydata.org/pandas-docs/stable/missing_data.html#missing-data

  1. Reindexing 允许您更改/添加/删除指定轴上的索引。这将返回数据的副本。
  2. In [55]: df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])
  3.  
  4. In [56]: df1.loc[dates[0]:dates[1],'E'] = 1
  5.  
  6. In [57]: df1
  7. Out[57]:
  8. A B C D F E
  9. 2013-01-01 0.000000 0.000000 -1.509059 5 NaN 1.0
  10. 2013-01-02 1.212112 -0.173215 0.119209 5 1.0 1.0
  11. 2013-01-03 -0.861849 -2.104569 -0.494929 5 2.0 NaN
  12. 2013-01-04 0.721555 -0.706771 -1.039575 5 3.0 NaN

删除任何缺少数据的行。

  1. In [58]: df1.dropna(how='any')
  2. Out[58]:
  3. A B C D F E
  4. 2013-01-02 1.212112 -0.173215 0.119209 5 1.0 1.0

填写缺少的数据

  1. In [59]: df1.fillna(value=5)
  2. Out[59]:
  3. A B C D F E
  4. 2013-01-01 0.000000 0.000000 -1.509059 5 5.0 1.0
  5. 2013-01-02 1.212112 -0.173215 0.119209 5 1.0 1.0
  6. 2013-01-03 -0.861849 -2.104569 -0.494929 5 2.0 5.0
  7. 2013-01-04 0.721555 -0.706771 -1.039575 5 3.0 5.0

获取值为 nan 的布尔值

  1. In [60]: pd.isna(df1)
  2. Out[60]:
  3. A B C D F E
  4. 2013-01-01 False False False False True False
  5. 2013-01-02 False False False False False False
  6. 2013-01-03 False False False False False True
  7. 2013-01-04 False False False False False True

操作

请参阅 Basic section on Binary Ops(http://pandas.pydata.org/pandas-docs/stable/basics.html#basics-binop

统计

一般操作不包括丢失的数据。
执行描述性统计

  1. In [61]: df.mean()
  2. Out[61]:
  3. A -0.004474
  4. B -0.383981
  5. C -0.687758
  6. D 5.000000
  7. F 3.000000
  8. dtype: float64

相同的操作在另一个轴上

  1. In [62]: df.mean(1)
  2. Out[62]:
  3. 2013-01-01 0.872735
  4. 2013-01-02 1.431621
  5. 2013-01-03 0.707731
  6. 2013-01-04 1.395042
  7. 2013-01-05 1.883656
  8. 2013-01-06 1.592306
  9. Freq: D, dtype: float64

使用具有不同维度和需要对齐的对象进行操作。另外,大熊猫会沿指定的尺寸自动变化。

  1. In [63]: s = pd.Series([1,3,5,np.nan,6,8], index=dates).shift(2)
  2.  
  3. In [64]: s
  4. Out[64]:
  5. 2013-01-01 NaN
  6. 2013-01-02 NaN
  7. 2013-01-03 1.0
  8. 2013-01-04 3.0
  9. 2013-01-05 5.0
  10. 2013-01-06 NaN
  11. Freq: D, dtype: float64
  12.  
  13. In [65]: df.sub(s, axis='index')
  14. Out[65]:
  15. A B C D F
  16. 2013-01-01 NaN NaN NaN NaN NaN
  17. 2013-01-02 NaN NaN NaN NaN NaN
  18. 2013-01-03 -1.861849 -3.104569 -1.494929 4.0 1.0
  19. 2013-01-04 -2.278445 -3.706771 -4.039575 2.0 0.0
  20. 2013-01-05 -5.424972 -4.432980 -4.723768 0.0 -1.0
  21. 2013-01-06 NaN NaN NaN NaN NaN

应用(apply)

将函数应用于数据

  1. In [66]: df.apply(np.cumsum)
  2. Out[66]:
  3. A B C D F
  4. 2013-01-01 0.000000 0.000000 -1.509059 5 NaN
  5. 2013-01-02 1.212112 -0.173215 -1.389850 10 1.0
  6. 2013-01-03 0.350263 -2.277784 -1.884779 15 3.0
  7. 2013-01-04 1.071818 -2.984555 -2.924354 20 6.0
  8. 2013-01-05 0.646846 -2.417535 -2.648122 25 10.0
  9. 2013-01-06 -0.026844 -2.303886 -4.126549 30 15.0
  10.  
  11. In [67]: df.apply(lambda x: x.max() - x.min())
  12. Out[67]:
  13. A 2.073961
  14. B 2.671590
  15. C 1.785291
  16. D 0.000000
  17. F 4.000000
  18. dtype: float64

直方图化(Histogramming)

请参阅 Histogramming and Discretization(http://pandas.pydata.org/pandas-docs/stable/basics.html#basics-discretization

  1. In [68]: s = pd.Series(np.random.randint(0, 7, size=10))
  2.  
  3. In [69]: s
  4. Out[69]:
  5. 0 4
  6. 1 2
  7. 2 1
  8. 3 2
  9. 4 6
  10. 5 4
  11. 6 4
  12. 7 6
  13. 8 4
  14. 9 4
  15. dtype: int64
  16.  
  17. In [70]: s.value_counts()
  18. Out[70]:
  19. 4 5
  20. 6 2
  21. 2 2
  22. 1 1
  23. dtype: int64

字符串方法

Series 在 str 属性中配备了一组字符串处理方法,使得在数组的每个元素上操作都变得很容易,如下面的代码片段所示。请注意,str中的模式匹配通常默认使用正则表达式(在某些情况下始终使用它们)。在矢量化字符串方法(http://pandas.pydata.org/pandas-docs/stable/text.html#text-string-methods)中查看更多。

  1. In [71]: s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])
  2.  
  3. In [72]: s.str.lower()
  4. Out[72]:
  5. 0 a
  6. 1 b
  7. 2 c
  8. 3 aaba
  9. 4 baca
  10. 5 NaN
  11. 6 caba
  12. 7 dog
  13. 8 cat
  14. dtype: object

合并

Concat

在连接/合并类型操作的情况下,熊猫提供了各种功能,可以方便地将 Series,DataFrame 和 Panel 对象与索引和关系代数功能的各种设置逻辑组合在一起。
请参阅合并部分(http://pandas.pydata.org/pandas-docs/stable/merging.html#merging
连接 pandas 对象和 concat():

  1. In [73]: df = pd.DataFrame(np.random.randn(10, 4))
  2.  
  3. In [74]: df
  4. Out[74]:
  5. 0 1 2 3
  6. 0 -0.548702 1.467327 -1.015962 -0.483075
  7. 1 1.637550 -1.217659 -0.291519 -1.745505
  8. 2 -0.263952 0.991460 -0.919069 0.266046
  9. 3 -0.709661 1.669052 1.037882 -1.705775
  10. 4 -0.919854 -0.042379 1.247642 -0.009920
  11. 5 0.290213 0.495767 0.362949 1.548106
  12. 6 -1.131345 -0.089329 0.337863 -0.945867
  13. 7 -0.932132 1.956030 0.017587 -0.016692
  14. 8 -0.575247 0.254161 -1.143704 0.215897
  15. 9 1.193555 -0.077118 -0.408530 -0.862495
  16.  
  17. # break it into pieces
  18. In [75]: pieces = [df[:3], df[3:7], df[7:]]
  19.  
  20. In [76]: pd.concat(pieces)
  21. Out[76]:
  22. 0 1 2 3
  23. 0 -0.548702 1.467327 -1.015962 -0.483075
  24. 1 1.637550 -1.217659 -0.291519 -1.745505
  25. 2 -0.263952 0.991460 -0.919069 0.266046
  26. 3 -0.709661 1.669052 1.037882 -1.705775
  27. 4 -0.919854 -0.042379 1.247642 -0.009920
  28. 5 0.290213 0.495767 0.362949 1.548106
  29. 6 -1.131345 -0.089329 0.337863 -0.945867
  30. 7 -0.932132 1.956030 0.017587 -0.016692
  31. 8 -0.575247 0.254161 -1.143704 0.215897
  32. 9 1.193555 -0.077118 -0.408530 -0.
  1. 862495

Join

SQL 风格合并。请参阅数据库样式的 joining

  1. In [77]: left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})
  2.  
  3. In [78]: right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})
  4.  
  5. In [79]: left
  6. Out[79]:
  7. key lval
  8. 0 foo 1
  9. 1 foo 2
  10.  
  11. In [80]: right
  12. Out[80]:
  13. key rval
  14. 0 foo 4
  15. 1 foo 5
  16.  
  17. In [81]: pd.merge(left, right, on='key')
  18. Out[81]:
  19. key lval rval
  20. 0 foo 1 4
  21. 1 foo 1 5
  22. 2 foo 2 4
  23. 3 foo 2 5

另一个可以给出的例子是:

  1. In [82]: left = pd.DataFrame({'key': ['foo', 'bar'], 'lval': [1, 2]})
  2.  
  3. In [83]: right = pd.DataFrame({'key': ['foo', 'bar'], 'rval': [4, 5]})
  4.  
  5. In [84]: left
  6. Out[84]:
  7. key lval
  8. 0 foo 1
  9. 1 bar 2
  10.  
  11. In [85]: right
  12. Out[85]:
  13. key rval
  14. 0 foo 4
  15. 1 bar 5
  16.  
  17. In [86]: pd.merge(left, right, on='key')
  18. Out[86]:
  19. key lval rval
  20. 0 foo 1 4
  21. 1 bar 2 5

Append

将行附加到数据框。见 Appending

  1. In [87]: df = pd.DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])
  2.  
  3. In [88]: df
  4. Out[88]:
  5. A B C D
  6. 0 1.346061 1.511763 1.627081 -0.990582
  7. 1 -0.441652 1.211526 0.268520 0.024580
  8. 2 -1.577585 0.396823 -0.105381 -0.532532
  9. 3 1.453749 1.208843 -0.080952 -0.264610
  10. 4 -0.727965 -0.589346 0.339969 -0.693205
  11. 5 -0.339355 0.593616 0.884345 1.591431
  12. 6 0.141809 0.220390 0.435589 0.192451
  13. 7 -0.096701 0.803351 1.715071 -0.708758
  14.  
  15. In [89]: s = df.iloc[3]
  16.  
  17. In [90]: df.append(s, ignore_index=True)
  18. Out[90]:
  19. A B C D
  20. 0 1.346061 1.511763 1.627081 -0.990582
  21. 1 -0.441652 1.211526 0.268520 0.024580
  22. 2 -1.577585 0.396823 -0.105381 -0.532532
  23. 3 1.453749 1.208843 -0.080952 -0.264610
  24. 4 -0.727965 -0.589346 0.339969 -0.693205
  25. 5 -0.339355 0.593616 0.884345 1.591431
  26. 6 0.141809 0.220390 0.435589 0.192451
  27. 7 -0.096701 0.803351 1.715071 -0.708758
  28. 8 1.453749 1.208843 -0.080952 -0.264610

分类

通过 “group by”,我们指的是涉及一个或多个以下步骤的过程

  • Splitting 根据一些标准将数据分组
  • Applying 根据一些标准将数据分组
  • Combining 将结果组合成一个数据结构

请参阅分组部分(http://pandas.pydata.org/pandas-docs/stable/groupby.html#groupby

  1. In [91]: df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
  2. ....: 'foo', 'bar', 'foo', 'foo'],
  3. ....: 'B' : ['one', 'one', 'two', 'three',
  4. ....: 'two', 'two', 'one', 'three'],
  5. ....: 'C' : np.random.randn(8),
  6. ....: 'D' : np.random.randn(8)})
  7. ....:
  8.  
  9. In [92]: df
  10. Out[92]:
  11. A B C D
  12. 0 foo one -1.202872 -0.055224
  13. 1 bar one -1.814470 2.395985
  14. 2 foo two 1.018601 1.552825
  15. 3 bar three -0.595447 0.166599
  16. 4 foo two 1.395433 0.047609
  17. 5 bar two -0.392670 -0.136473
  18. 6 foo one 0.007207 -0.561757
  19. 7 foo three 1.928123 -1.623033

分组,然后将函数总和应用于结果组。

  1. In [93]: df.groupby('A').sum()
  2. Out[93]:
  3. C D
  4. A
  5. bar -2.802588 2.42611
  6. foo 3.146492 -0.63958

按多列分组会形成一个分层索引,然后我们应用这个函数。

  1. In [94]: df.groupby(['A','B']).sum()
  2. Out[94]:
  3. C D
  4. A B
  5. bar one -1.814470 2.395985
  6. three -0.595447 0.166599
  7. two -0.392670 -0.136473
  8. foo one -1.195665 -0.616981
  9. three 1.928123 -1.623033
  10. two 2.414034 1.600434

重塑

请参阅分层索引(http://pandas.pydata.org/pandas-docs/stable/advanced.html#advanced-hierarchical)和重塑(http://pandas.pydata.org/pandas-docs/stable/reshaping.html#reshaping-stacking)的章节。

堆(Stack)

  1. In [95]: tuples = list(zip(*[['bar', 'bar', 'baz', 'baz',
  2. ....: 'foo', 'foo', 'qux', 'qux'],
  3. ....: ['one', 'two', 'one', 'two',
  4. ....: 'one', 'two', 'one', 'two']]))
  5. ....:
  6.  
  7. In [96]: index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
  8.  
  9. In [97]: df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=['A', 'B'])
  10.  
  11. In [98]: df2 = df[:4]
  12.  
  13. In [99]: df2
  14. Out[99]:
  15. A B
  16. first second
  17. bar one 0.029399 -0.542108
  18. two 0.282696 -0.087302
  19. baz one -1.575170 1.771208
  20. two 0.816482 1.100230

stack()方法“压缩” DataFrame 列中的级别。

  1. In [100]: stacked = df2.stack()
  2.  
  3. In [101]: stacked
  4. Out[101]:
  5. first second
  6. bar one A 0.029399
  7. B -0.542108
  8. two A 0.282696
  9. B -0.087302
  10. baz one A -1.575170
  11. B 1.771208
  12. two A 0.816482
  13. B 1.100230
  14. dtype: float64

对于“堆叠的” DataFrame 或 Series(以MultiIndex为索引),stack()的逆操作是 unstack(),默认情况下,它将卸载最后一层:

  1. In [102]: stacked.unstack()
  2. Out[102]:
  3. A B
  4. first second
  5. bar one 0.029399 -0.542108
  6. two 0.282696 -0.087302
  7. baz one -1.575170 1.771208
  8. two 0.816482 1.100230
  9.  
  10. In [103]: stacked.unstack(1)
  11. Out[103]:
  12. second one two
  13. first
  14. bar A 0.029399 0.282696
  15. B -0.542108 -0.087302
  16. baz A -1.575170 0.816482
  17. B 1.771208 1.100230
  18.  
  19. In [104]: stacked.unstack(0)
  20. Out[104]:
  21. first bar baz
  22. second
  23. one A 0.029399 -1.575170
  24. B -0.542108 1.771208
  25. two A 0.282696 0.816482
  26. B -0.087302 1.100230

数据透视表

请参阅数据透视表(http://pandas.pydata.org/pandas-docs/stable/reshaping.html#reshaping-pivot

  1. In [105]: df = pd.DataFrame({'A' : ['one', 'one', 'two', 'three'] * 3,
  2. .....: 'B' : ['A', 'B', 'C'] * 4,
  3. .....: 'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 2,
  4. .....: 'D' : np.random.randn(12),
  5. .....: 'E' : np.random.randn(12)})
  6. .....:
  7.  
  8. In [106]: df
  9. Out[106]:
  10. A B C D E
  11. 0 one A foo 1.418757 -0.179666
  12. 1 one B foo -1.879024 1.291836
  13. 2 two C foo 0.536826 -0.009614
  14. 3 three A bar 1.006160 0.392149
  15. 4 one B bar -0.029716 0.264599
  16. 5 one C bar -1.146178 -0.057409
  17. 6 two A foo 0.100900 -1.425638
  18. 7 three B foo -1.035018 1.024098
  19. 8 one C foo 0.314665 -0.106062
  20. 9 one A bar -0.773723 1.824375
  21. 10 two B bar -1.170653 0.595974
  22. 11 three C bar 0.648740 1.167115

我们可以很容易地从这些数据生成数据透视表:

  1. In [107]: pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C'])
  2. Out[107]:
  3. C bar foo
  4. A B
  5. one A -0.773723 1.418757
  6. B -0.029716 -1.879024
  7. C -1.146178 0.314665
  8. three A 1.006160 NaN
  9. B NaN -1.035018
  10. C 0.648740 NaN
  11. two A NaN 0.100900
  12. B -1.170653 NaN
  13. C NaN 0.536826

时间序列

熊猫具有用于在频率转换期间执行重采样操作(例如,其次将数据转换为5分钟数据)的简单,强大且高效的功能。这在金融应用中非常普遍,但不限于此。请参阅时间系列(http://pandas.pydata.org/pandas-docs/stable/timeseries.html#timeseries

  1. In [108]: rng = pd.date_range('1/1/2012', periods=100, freq='S')
  2.  
  3. In [109]: ts = pd.Series(np.random.randint(0, 500, len(rng)), index=rng)
  4.  
  5. In [110]: ts.resample('5Min').sum()
  6. Out[110]:
  7. 2012-01-01 25083
  8. Freq: 5T, dtype: int64

时区表示

  1. In [111]: rng = pd.date_range('3/6/2012 00:00', periods=5, freq='D')
  2.  
  3. In [112]: ts = pd.Series(np.random.randn(len(rng)), rng)
  4.  
  5. In [113]: ts
  6. Out[113]:
  7. 2012-03-06 0.464000
  8. 2012-03-07 0.227371
  9. 2012-03-08 -0.496922
  10. 2012-03-09 0.306389
  11. 2012-03-10 -2.290613
  12. Freq: D, dtype: float64
  13.  
  14. In [114]: ts_utc = ts.tz_localize('UTC')
  15.  
  16. In [115]: ts_utc
  17. Out[115]:
  18. 2012-03-06 00:00:00+00:00 0.464000
  19. 2012-03-07 00:00:00+00:00 0.227371
  20. 2012-03-08 00:00:00+00:00 -0.496922
  21. 2012-03-09 00:00:00+00:00 0.306389
  22. 2012-03-10 00:00:00+00:00 -2.290613
  23. Freq: D, dtype: float64

转换到另一个时区

  1. In [116]: ts_utc.tz_convert('US/Eastern')
  2. Out[116]:
  3. 2012-03-05 19:00:00-05:00 0.464000
  4. 2012-03-06 19:00:00-05:00 0.227371
  5. 2012-03-07 19:00:00-05:00 -0.496922
  6. 2012-03-08 19:00:00-05:00 0.306389
  7. 2012-03-09 19:00:00-05:00 -2.290613
  8. Freq: D, dtype: float64

在时间跨度表示之间进行转换

  1. In [117]: rng = pd.date_range('1/1/2012', periods=5, freq='M')
  2.  
  3. In [118]: ts = pd.Series(np.random.randn(len(rng)), index=rng)
  4.  
  5. In [119]: ts
  6. Out[119]:
  7. 2012-01-31 -1.134623
  8. 2012-02-29 -1.561819
  9. 2012-03-31 -0.260838
  10. 2012-04-30 0.281957
  11. 2012-05-31 1.523962
  12. Freq: M, dtype: float64
  13.  
  14. In [120]: ps = ts.to_period()
  15.  
  16. In [121]: ps
  17. Out[121]:
  18. 2012-01 -1.134623
  19. 2012-02 -1.561819
  20. 2012-03 -0.260838
  21. 2012-04 0.281957
  22. 2012-05 1.523962
  23. Freq: M, dtype: float64
  24.  
  25. In [122]: ps.to_timestamp()
  26. Out[122]:
  27. 2012-01-01 -1.134623
  28. 2012-02-01 -1.561819
  29. 2012-03-01 -0.260838
  30. 2012-04-01 0.281957
  31. 2012-05-01 1.523962
  32. Freq: MS, dtype: float64

周期和时间戳之间的转换可以使用一些方便的算术功能。在下面的例子中,我们将季度结束时间从11月份转换为季末结束时的上午9点:

  1. In [123]: prng = pd.period_range('1990Q1', '2000Q4', freq='Q-NOV')
  2.  
  3. In [124]: ts = pd.Series(np.random.randn(len(prng)), prng)
  4.  
  5. In [125]: ts.index = (prng.asfreq('M', 'e') + 1).asfreq('H', 's') + 9
  6.  
  7. In [126]: ts.head()
  8. Out[126]:
  9. 1990-03-01 09:00 -0.902937
  10. 1990-06-01 09:00 0.068159
  11. 1990-09-01 09:00 -0.057873
  12. 1990-12-01 09:00 -0.368204
  13. 1991-03-01 09:00 -1.144073
  14. Freq: H, dtype: float64

分类

Pandas可以在 DataFrame 中包含分类数据。有关完整文档,请参阅分类介绍(http://pandas.pydata.org/pandas-docs/stable/categorical.html#categorical)和 API 文档(http://pandas.pydata.org/pandas-docs/stable/api.html#api-categorical

  1. In [127]: df = pd.DataFrame({"id":[1,2,3,4,5,6], "raw_grade":['a', 'b', 'b', 'a', 'a', 'e']})

将原始等级转换为分类数据类型。

  1. In [128]: df["grade"] = df["raw_grade"].astype("category")
  2.  
  3. In [129]: df["grade"]
  4. Out[129]:
  5. 0 a
  6. 1 b
  7. 2 b
  8. 3 a
  9. 4 a
  10. 5 e
  11. Name: grade, dtype: category
  12. Categories (3, object): [a, b, e
  1. ]

将类别重命名为更有意义的名称(指定到 Series.cat.categories 就是!)
In [130]: df["grade"].cat.categories = ["very good", "good", "very bad"]
重新排列类别并同时添加缺少的类别(Series .cat 下的方法默认返回一个新的系列)。

  1. In [131]: df["grade"] = df["grade"].cat.set_categories(["very bad", "bad", "medium", "good", "very good"])
  2.  
  3. In [132]: df["grade"]
  4. Out[132]:
  5. 0 very good
  6. 1 good
  7. 2 good
  8. 3 very good
  9. 4 very good
  10. 5 very bad
  11. Name: grade, dtype: category
  12. Categories (5, object): [very bad, bad, medium, good, very good]

排序是按类别排序的,而不是词汇顺序。

  1. In [133]: df.sort_values(by="grade")
  2. Out[133]:
  3. id raw_grade grade
  4. 5 6 e very bad
  5. 1 2 b good
  6. 2 3 b good
  7. 0 1 a very good
  8. 3 4 a very good
  9. 4 5 a very good

按分类列分组也显示空白类别。

  1. In [134]: df.groupby("grade").size()
  2. Out[134]:
  3. grade
  4. very bad 1
  5. bad 0
  6. medium 0
  7. good 2
  8. very good 3
  9. dtype: int64

绘制(Plotting)

绘制文档(http://pandas.pydata.org/pandas-docs/stable/visualization.html#visualization

  1. In [135]: ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
  2.  
  3. In [136]: ts = ts.cumsum()
  4.  
  5. In [137]: ts.plot()
  6. Out[137]: <matplotlib.axes._subplots.AxesSubplot at 0x1122ad630>

在 DataFrame 上,plot()方便绘制所有带标签的列:

  1. In [138]: df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index,
  2. .....: columns=['A', 'B', 'C', 'D'])
  3. .....:
  4.  
  5. In [139]: df = df.cumsum()
  6.  
  7. In [140]: plt.figure(); df.plot(); plt.legend(loc='best')
  8. Out[140]: <matplotlib.legend.Legend at 0x115033cf8>

数据输入/输出

CSV

写入一个CSV文件(http://pandas.pydata.org/pandas-docs/stable/io.html#io-store-in-csv

  1. In [141]: df.to_csv('foo.csv')

从 csv 文件读取(http://pandas.pydata.org/pandas-docs/stable/io.html#io-read-csv-table

  1. In [142]: pd.read_csv('foo.csv')
  2. Out[142]:
  3. Unnamed: 0 A B C D
  4. 0 2000-01-01 0.266457 -0.399641 -0.219582 1.186860
  5. 1 2000-01-02 -1.170732 -0.345873 1.653061 -0.282953
  6. 2 2000-01-03 -1.734933 0.530468 2.060811 -0.515536
  7. 3 2000-01-04 -1.555121 1.452620 0.239859 -1.156896
  8. 4 2000-01-05 0.578117 0.511371 0.103552 -2.428202
  9. 5 2000-01-06 0.478344 0.449933 -0.741620 -1.962409
  10. 6 2000-01-07 1.235339 -0.091757 -1.543861 -1.084753
  11. .. ... ... ... ... ...
  12. 993 2002-09-20 -10.628548 -9.153563 -7.883146 28.313940
  13. 994 2002-09-21 -10.390377 -8.727491 -6.399645 30.914107
  14. 995 2002-09-22 -8.985362 -8.485624 -4.669462 31.367740
  15. 996 2002-09-23 -9.558560 -8.781216 -4.499815 30.518439
  16. 997 2002-09-24 -9.902058 -9.340490 -4.386639 30.105593
  17. 998 2002-09-25 -10.216020 -9.480682 -3.933802 29.758560
  18. 999 2002-09-26 -11.856774 -10.671012 -3.216025 29.369368
  19.  
  20. [1000 rows x 5 columns
  1. ]

HDF5

读写 HDFStore:http://pandas.pydata.org/pandas-docs/stable/io.html#io-hdf5
写入 HDF5

  1. In [143]: df.to_hdf('foo.h5','df')

读取 HDF5

  1. In [144]: pd.read_hdf('foo.h5','df')
  2. Out[144]:
  3. A B C D
  4. 2000-01-01 0.266457 -0.399641 -0.219582 1.186860
  5. 2000-01-02 -1.170732 -0.345873 1.653061 -0.282953
  6. 2000-01-03 -1.734933 0.530468 2.060811 -0.515536
  7. 2000-01-04 -1.555121 1.452620 0.239859 -1.156896
  8. 2000-01-05 0.578117 0.511371 0.103552 -2.428202
  9. 2000-01-06 0.478344 0.449933 -0.741620 -1.962409
  10. 2000-01-07 1.235339 -0.091757 -1.543861 -1.084753
  11. ... ... ... ... ...
  12. 2002-09-20 -10.628548 -9.153563 -7.883146 28.313940
  13. 2002-09-21 -10.390377 -8.727491 -6.399645 30.914107
  14. 2002-09-22 -8.985362 -8.485624 -4.669462 31.367740
  15. 2002-09-23 -9.558560 -8.781216 -4.499815 30.518439
  16. 2002-09-24 -9.902058 -9.340490 -4.386639 30.105593
  17. 2002-09-25 -10.216020 -9.480682 -3.933802 29.758560
  18. 2002-09-26 -11.856774 -10.671012 -3.216025 29.369368
  19.  
  20. [1000 rows x 4 columns]

Excel

阅读和写入 MS Excel:http://pandas.pydata.org/pandas-docs/stable/io.html#io-excel
写入一个 excel 文件

  1. In [145]: df.to_excel('foo.xlsx', sheet_name='Sheet1')

从 Excel 文件中读取

  1. In [146]: pd.read_excel('foo.xlsx', 'Sheet1', index_col=None, na_values=['NA'])
  2. Out[146]:
  3. A B C D
  4. 2000-01-01 0.266457 -0.399641 -0.219582 1.186860
  5. 2000-01-02 -1.170732 -0.345873 1.653061 -0.282953
  6. 2000-01-03 -1.734933 0.530468 2.060811 -0.515536
  7. 2000-01-04 -1.555121 1.452620 0.239859 -1.156896
  8. 2000-01-05 0.578117 0.511371 0.103552 -2.428202
  9. 2000-01-06 0.478344 0.449933 -0.741620 -1.962409
  10. 2000-01-07 1.235339 -0.091757 -1.543861 -1.084753
  11. ... ... ... ... ...
  12. 2002-09-20 -10.628548 -9.153563 -7.883146 28.313940
  13. 2002-09-21 -10.390377 -8.727491 -6.399645 30.914107
  14. 2002-09-22 -8.985362 -8.485624 -4.669462 31.367740
  15. 2002-09-23 -9.558560 -8.781216 -4.499815 30.518439
  16. 2002-09-24 -9.902058 -9.340490 -4.386639 30.105593
  17. 2002-09-25 -10.216020 -9.480682 -3.933802 29.758560
  18. 2002-09-26 -11.856774 -10.671012 -3.216025 29.369368
  19.  
  20. [1000 rows x 4 columns]

pandas库的学习笔记的更多相关文章

  1. [Python ]小波变化库——Pywalvets 学习笔记

    [Python ]小波变化库——Pywalvets 学习笔记 2017年03月20日 14:04:35 SNII_629 阅读数:24776 标签: python库pywavelets小波变换 更多 ...

  2. 数据分析之Pandas和Numpy学习笔记(持续更新)<1>

    pandas and numpy notebook        最近工作交接,整理电脑资料时看到了之前的基于Jupyter学习数据分析相关模块学习笔记.想着拿出来分享一下,可是Jupyter导出来h ...

  3. Python Pandas库的学习(一)

    今天我们来学习一下Pandas库,前面我们讲了Numpy库的学习 接下来我们学习一下比较重要的库Pandas库,这个库比Numpy库还重要 Pandas库是在Numpy库上进行了封装,相当于高级Num ...

  4. Pandas 性能优化 学习笔记

    摘要 本文介绍了使用 Pandas 进行数据挖掘时常用的加速技巧. 实验环境 import numpy as np import pandas as pd print(np.__version__) ...

  5. Python Pandas库的学习(三)

    今天我们来继续讲解Python中的Pandas库的基本用法 那么我们如何使用pandas对数据进行排序操作呢? food.sort_values("Sodium_(mg)",inp ...

  6. Python Pandas库的学习(二)

    今天我们继续讲下Python中一款数据分析很好的库.Pandas的学习 接着上回讲到的,如果有人听不懂,麻烦去翻阅一下我前面讲到的Pandas学习(一) 如果我们在数据中,想去3,4,5这几行数据,那 ...

  7. 《C标准库》学习笔记整理

    简介 <C标准库>书中对 C 标准库中的 15 个头文件的内容进行了详细的介绍,包括各头文件设计的背景知识.头文件中的内容.头文件中定义的函数和变量的使用.实现.测试等. 我学习此书的目的 ...

  8. 微软企业库Unity学习笔记

    本文主要介绍: 关于Unity container配置,注册映射关系.类型,单实例.已存在对象和指出一些container的基本配置,这只是我关于Unity的学习心得和笔记,希望能够大家多交流相互学习 ...

  9. 自己在linux上编译、链接、动态库和静态库的学习笔记

    在平常的项目中,我们都是使用公司要求的makefile.makedebug一类的文件,因此,在编译.链接.生成和链接动态库与静态库的时候,我们只是简单的使用一些已经设置的变量,只是简单的修改.添加一些 ...

随机推荐

  1. 注意UTF-8-BOM 这个编码格式

    有时候文本文件处理出现异常,找不到其他原因的时候,注意查看下文件的编码: Notepad:编码菜单 如果发现是UTF-8-BOM,需要改成UTF-8

  2. centos7.4下的KVM虚拟机安装使用

    本来是用的vmware,不过后来想试下KVM,想着装个ZSTACK也行,结果zstack使用网络安装没搞明白,把物理机系统毁了,这下彻底完蛋了,只好还装个centos了,但是又不想用VMWARE就想起 ...

  3. 前端笔记-javaScript-1

    一.JavaScript概述 1.JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEa ...

  4. linux 之用户管理

    用户的家目录 普通用户:/home/用户名/,所有者和所属组都是此用户,权限是700 超级用户:/root/,所有者和所属组都是root用户,权限是550 用户邮箱目录 /var/spool/mail ...

  5. 【博客开篇】服务器配置:Windows2008R2+PHP5.6+SQLServer2008(X64)

    现下流行LAMP,如果选择Windows服务器,那么一般都会选择IIS+Asp.Net+SQL Server(可以简称为WINS),这些配置起来,都是非常方便的. 但也有一些特殊的服务器配置,例如:W ...

  6. 浅谈openstack中使用linux_bridge实现vxlan网络

    openstack环境: 1 版本:ocata 2 系统:ubuntu16.04.2 3 控制节点 1个 + 计算节点 1个 4 控制节点网卡为ens33,ip = 172.171.5.200 ens ...

  7. 文件下载Controller,文件夹内容监听,文件上传,运行程序通过url实现文件下载

    文件下载Controller @RequestMapping("/fileDownLoad") public ResponseEntity<byte[]> fileDo ...

  8. oracle数值函数 abs()、 ceil()、 cos()、 cosh()

    1.abs绝对值函数 格式 abs(number) 即abs(数值) 例如 abs(100) 结果为 100,abs(-100)结果为100: 2.ceil用来取数值最小整数函数 格式 ceil(nu ...

  9. Python 的xlutils模块

    python模块: xlrd:读取excel xlwt:写入excel 缺点:excel格式无法复用 推荐xlutils模块 可复制原excel格式 from xlutils.copy import ...

  10. Mybateis mapper 接口 example 用法

    注意:希望通过此篇文章分享 可以使大家对mapper接口以及example 用法更加深入理解 MyBatis的Mapper接口以及Example的实例函数及详解 一.mapper接口中的方法解析 ma ...