python - Pandas

Pandas 是一个很强大的数据科学分析工具,你可以把它当做是Excel。它是NumPy的延伸库。如果结合NumPy使用,基本上可以解决大多数据问题。 我将从下面几个方面来介绍Pandas的一些常用功能和函数:

  • Series 级数
  • DataFrames 数据框
  • Missing Data 空值(无效值)
  • GroupBy 分组
  • Merging, Joining,and Concatenating 归并
  • Operations 运算操作0
  • Data Input and Output 数据输入输出

Series

Series 很像 NumPy中的Array。两者的区别是: Series会有一个一个axis labels(维度标签),这个axis labels不仅仅是数字,Series可以用这个作为索引。而array的只能用实数表示位置。另外Series中的数据可以是任何类型的object,但是array中只能是数字(NumPy1.1版本数据类型)。从这个功能上看,Series有点像是Hash table。

让我们来看几个例子先:

import numpy as np
import pandas as pd

创建一个 Series

你可以将 list,numpy array, 或者 dictionary 转换成 Series:

labels = ['a','b','c']   #list
my_list = [10,20,30]    #list
arr = np.array([10,20,30])   # numpy array
d = {'a':10,'b':20,'c':30}   # dictionary
用 Lists
pd.Series(data=my_list)
0    10
1    20
2    30
dtype: int64
pd.Series(data=my_list,index=labels)   # Series主要的两个参数data在前,index在后
a    10
b    20
c    30
dtype: int64
pd.Series(my_list,labels)  # 在正式项目中最好指明哪个变量指向哪个参数

以后我还要介绍更多数据科学工具,有些功能与NumPy或者pandas相似,但是更专业,出来的效果对business更有帮助。所以在对代码格式和报告要求不严格的项目中可以随意一些,但是严谨的business项目中最好要对格式有所要求。

a    10
b    20
c    30
dtype: int64
NumPy Arrays
pd.Series(arr)  # axis labels 默认为有理实数
0    10
1    20
2    30
dtype: int64
pd.Series(arr,labels)
a    10
b    20
c    30
dtype: int64

Dictionary

pd.Series(d)
a    10
b    20
c    30
dtype: int64

Series里的数据类型

pandas Series 可以存放很多种数据类型:

pd.Series(data=labels)
0    a
1    b
2    c
dtype: object
# 甚至函数
pd.Series([sum,print,len])
0      <built-in function sum>
1    <built-in function print>  # 必须加 from __future__ import print_function 在代码前,原因参考下面列表
2      <built-in function len>
dtype: object

所有的build-in函数列表

使用Index

使用Series的关键在于使用index,Series包含两个关键参数:data和index,可见index的地位与data同等重要。学会使用index可以更快查找数据。 下面几个例子将练习如何在Series中使用index,首先我们创建两个Series: ser1 & ser2

ser1 = pd.Series([1,2,3,4],index = ['USA', 'Germany','USSR', 'Japan'])                                   

ser1
USA        1
Germany    2
USSR       3
Japan      4
dtype: int64
ser2 = pd.Series([1,2,5,4],index = ['USA', 'Germany','Italy', 'Japan'])                                   
ser2
USA        1
Germany    2
Italy      5
Japan      4
dtype: int64
ser1['USA']
1

算数运算也会基于index进行

ser1 + ser2
Germany    4.0
Italy      NaN
Japan      8.0
USA        2.0
USSR       NaN
dtype: float64  # 一旦进行算数运算结果自动转换为float.并且结果根据index将序排列

简单介绍一下,如果想向Series中增加数据,一般用set_value.后面的参数需要跟index和data。append和add方法只能加入另外一个一个Series。

ser2.set_value('Canada',7)
USA        1
Germany    2
Italy      5
Japan      4
china      6
Canada     7
dtype: int64
ser1 + ser2
Canada     NaN
China      NaN
Germany    4.0
Italy      NaN
Japan      8.0
USA        2.0
USSR       NaN
dtype: float64
# 只有两个Series中共有的index相加才有有结果,否则得到NaN值。

DataFrames

DataFrames 的重要性不言而喻,受R语言的启发而开发出来的。 DataFrame就是许多object分享同一个index。在我学习R的时候很难理解DataFrame的意义。简单点来说你可以把它当做Excel里的一个sheet,或者数据库里的一个表。 让我们来看几个例子

import pandas as pd
import numpy as np
from numpy.random import randn
np.random.seed(101)  # seed 相当于reset。 因为随机数每次会取一个数作为seed,然后对这个数进行运算,通过算法得到一系列随机数,如果seed定了,那么得到的随机数是可以预测的。所以我们每次可以重置seed。
df = pd.DataFrame(randn(5,4),index='A B C D E'.split(),columns='W X Y Z'.split())

df
 WXYZ
A2.7068500.6281330.9079690.503826
B0.651118-0.319318-0.8480770.605965
C-2.0181680.7401220.528813-0.589001
D0.188695-0.758872-0.9332370.955057
E0.1907941.9787572.6059670.683509

Selection and Indexing

从DataFrame中选取数据

df['W']
A    2.706850
B    0.651118
C   -2.018168
D    0.188695
E    0.190794
Name: W, dtype: float64
# Pass a list of column names 注意是双括号
df[['W','Z']]
 WZ
A2.7068500.503826
B0.6511180.605965
C-2.018168-0.589001
D0.1886950.955057
E0.1907940.683509

用SQL语法(不推荐)

df.W
A    2.706850
B    0.651118
C   -2.018168
D    0.188695
E    0.190794
Name: W, dtype: float64

DataFrame 的 Columns 就是 Series (DataFrame Columns are just Series)

type(df['W'])
pandas.core.series.Series

增加列

df['new'] = df['W'] + df['Y']

df
 WXYZnew
A2.7068500.6281330.9079690.5038263.614819
B0.651118-0.319318-0.8480770.605965-0.196959
C-2.0181680.7401220.528813-0.589001-1.489355
D0.188695-0.758872-0.9332370.955057-0.744542
E0.1907941.9787572.6059670.6835092.796762

移除列

df.drop('new',axis=1) #axis=1指的是列,axis=0指行,axis=2指二维表,以此类推
 WXYZ
A2.7068500.6281330.9079690.503826
B0.651118-0.319318-0.8480770.605965
C-2.0181680.7401220.528813-0.589001
D0.188695-0.758872-0.9332370.955057
E0.1907941.9787572.6059670.683509

注意:inplace参数默认为false,即是否替换原数据。上一个drop没有设置inplace参数,所以df的数据,没有改变

df
 WXYZnew
A2.7068500.6281330.9079690.5038263.614819
B0.651118-0.319318-0.8480770.605965-0.196959
C-2.0181680.7401220.528813-0.589001-1.489355
D0.188695-0.758872-0.9332370.955057-0.744542
E0.1907941.9787572.6059670.6835092.796762

现在我们设置inplace参数

df.drop('new',axis=1,inplace=True)

df
 WXYZ
A2.7068500.6281330.9079690.503826
B0.651118-0.319318-0.8480770.605965
C-2.0181680.7401220.528813-0.589001
D0.188695-0.758872-0.9332370.955057
E0.1907941.9787572.6059670.683509

同样可以删除行

df.drop('E',axis=0)
 WXYZ
A2.7068500.6281330.9079690.503826
B0.651118-0.319318-0.8480770.605965
C-2.0181680.7401220.528813-0.589001
D0.188695-0.758872-0.9332370.955057

选择行

df.loc['A']  # 选择行必须要用loc或者iloc函数
W    2.706850
X    0.628133
Y    0.907969
Z    0.503826
Name: A, dtype: float64

或者用位置代替index

df.iloc[2]
W   -2.018168
X    0.740122
Y    0.528813
Z   -0.589001
Name: C, dtype: float64

选择子集

df.loc['B','Y']
-0.84807698340363147

注意啊,如果直接用 df[‘B’,’Y’] 会报错,用 df[‘Y’,’B’] 也会报错。所以必须用df.loc[‘B’,’Y’]

df.loc[['A','B'],['W','Y']]
 WY
A2.7068500.907969
B0.651118-0.848077
df.loc[['B','X','A','Y']]
B    0.190915
X         NaN
A   -0.747158
Y         NaN
Name: Y, dtype: float64

情况比较选择(Conditional Selection)

一个很重要的功能,很像numpy的一个功能:

df
 WXYZ
A2.7068500.6281330.9079690.503826
B0.651118-0.319318-0.8480770.605965
C-2.0181680.7401220.528813-0.589001
D0.188695-0.758872-0.9332370.955057
E0.1907941.9787572.6059670.683509
df>0
 WXYZ
ATrueTrueTrueTrue
BTrueFalseFalseTrue
CFalseTrueTrueFalse
DTrueFalseFalseTrue
ETrueTrueTrueTrue
df[df>0]
 WXYZ
A2.7068500.6281330.9079690.503826
B0.651118NaNNaN0.605965
CNaN0.7401220.528813NaN
D0.188695NaNNaN0.955057
E0.1907941.9787572.6059670.683509
# 注意,在上一个情况中为false的值会用NaN占位(当然以后我们在机器学习中可以用其他数值替换NaN),但是在这个情况中,为false的值直接不显示
df[df['W']>0]
 WXYZ
A2.7068500.6281330.9079690.503826
B0.651118-0.319318-0.8480770.605965
D0.188695-0.758872-0.9332370.955057
E0.1907941.9787572.6059670.683509
df[df['W']>0]['Y']
A    0.907969
B   -0.848077
D   -0.933237
E    2.605967
Name: Y, dtype: float64
df[df['W']>0][['Y','X']]
# 注意啦!注意啦!此处是两个双中括号的并列关系,前面一个设定条件,后面一个设置需要选择的范围
 YX
A0.9079690.628133
B-0.848077-0.319318
D-0.933237-0.758872
E2.6059671.978757
当有两个或两个以上条件时,需要用或者 & 连接
df[(df['W']>0) & (df['Y'] > 1)]
 WXYZ
E0.1907941.9787572.6059670.683509

更多index细节 让我们来看看更多index的使用情况

df
 WXYZnew
A2.7068500.6281330.9079690.5038263.614819
B0.651118-0.319318-0.8480770.605965-0.196959
C-2.0181680.7401220.528813-0.589001-1.489355
D0.188695-0.758872-0.9332370.955057-0.744542
E0.1907941.9787572.6059670.6835092.796762
# 将index重置为 0,1...n
df.reset_index()
# 会有inplace参数 和fillin参数可以重置index
 indexWXYZ
0A2.7068500.6281330.9079690.503826
1B0.651118-0.319318-0.8480770.605965
2C-2.0181680.7401220.528813-0.589001
3D0.188695-0.758872-0.9332370.955057
4E0.1907941.9787572.6059670.683509
newind = 'CA NY WY OR CO'.split()
df['States'] = newind

df # 增加新的一列
 WXYZStates
A2.7068500.6281330.9079690.503826CA
B0.651118-0.319318-0.8480770.605965NY
C-2.0181680.7401220.528813-0.589001WY
D0.188695-0.758872-0.9332370.955057OR
E0.1907941.9787572.6059670.683509CO
df.set_index('States')
 WXYZ
States    
CA2.7068500.6281330.9079690.503826
NY0.651118-0.319318-0.8480770.605965
WY-2.0181680.7401220.528813-0.589001
OR0.188695-0.758872-0.9332370.955057
CO0.1907941.9787572.6059670.683509
df
 WXYZStates
A2.7068500.6281330.9079690.503826CA
B0.651118-0.319318-0.8480770.605965NY
C-2.0181680.7401220.528813-0.589001WY
D0.188695-0.758872-0.9332370.955057OR
E0.1907941.9787572.6059670.683509CO
df.set_index('States',inplace=True)
# 由此可见inplace参数将影响到原数据
df
 WXYZ
States    
CA2.7068500.6281330.9079690.503826
NY0.651118-0.319318-0.8480770.605965
WY-2.0181680.7401220.528813-0.589001
OR0.188695-0.758872-0.9332370.955057
CO0.1907941.9787572.6059670.683509

复合index和index阶层

复合index 需要将index做成一个tuple

# Index Levels
outside = ['G1','G1','G1','G2','G2','G2']
inside = [1,2,3,1,2,3]
hier_index = list(zip(outside,inside))
hier_index = pd.MultiIndex.from_tuples(hier_index)
hier_index
MultiIndex(levels=[['G1', 'G2'], [1, 2, 3]],
           labels=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]])
df = pd.DataFrame(np.random.randn(6,2),index=hier_index,columns=['A','B'])
df
  AB
GroupNum  
 10.1536610.167638
G12-0.7659300.962299
 30.902826-0.537909
 1-1.5496710.435253
G221.259904-0.447898
 30.2662070.412580

利用xs函数返回dataframe的 cross-section子集 python df.xs('G1')

 AB
Num  
10.1536610.167638
2-0.7659300.962299
30.902826-0.537909
df.xs(['G1',1])
A    0.153661
B    0.167638
Name: (G1, 1), dtype: float64
df.xs(1,level='Num')
 AB
Group  
G10.1536610.167638
G2-1.5496710.435253

Missing Data(无效数据)

Pandas有几种方法来处理无效的数据

import numpy as np
import pandas as pd
df = pd.DataFrame({'A':[1,2,np.nan],
                  'B':[5,np.nan,np.nan],
                  'C':[1,2,3]})

df
 ABC
01.05.01
12.0NaN2
2NaNNaN3
df.dropna()  # 将含有nan值的rows一同删除

| | A | B | C | | —- | —- | —- | —- | | 0 | 1.0 | 5.0 | 1 | python df.dropna(axis=1) # 将含有nan值的columns一同删除

 C
01
12
23
df.dropna(thresh=2) # 这个很有用, drop掉所有含有有效数据(除NaN外)小于thresh的Series
# 还有个how参数,需要指定是drop掉全为NaN的行还是drop掉出现NaN的行,这我就不给出例子了
 ABC
01.05.01
12.0NaN2
df.fillna(value='FILL VALUE') # 这个不用介绍了吧
 ABC
0151
12FILL VALUE2
2FILL VALUEFILL VALUE3
df['A'].fillna(value=df['A'].mean())
0    1.0
1    2.0
2    1.5
Name: A, dtype: float64
df.fillna(value=df['B'].mean())
 ABC
01.05.01
12.05.02
25.05.03

所以记住处理NaN数据用dropna() 和 fillna() 两个方法就OK啦~~

Groupby

Groupby可以让你的数据分组并调用聚合函数。具体可以参考数据库中的groupby

import pandas as pd
# Create dataframe
data = {'Company':['GOOG','GOOG','MSFT','MSFT','FB','FB'],
       'Person':['Sam','Charlie','Amy','Vanessa','Carl','Sarah'],
       'Sales':[200,120,340,124,243,350]}
df = pd.DataFrame(data)

df
 CompanyPersonSales
0GOOGSam200
1GOOGCharlie120
2MSFTAmy340
3MSFTVanessa124
4FBCarl243
5FBSarah350

现在我们用groupBy()方法来进行分组,以下将增加一个 DataFrameGroupBy 的 object: python df.groupby('Company')<pandas.core.groupby.DataFrameGroupBy object at 0x113014128>

我们将它赋给一个新的变量 python by_comp = df.groupby("Company") 来call聚合方法 python by_comp.mean()

 Sales
Company 
FB296.5
GOOG160.0
MSFT232.0

等同于: python df.groupby('Company').mean()

 Sales
Company 
FB296.5
GOOG160.0
MSFT232.0

标准差: python by_comp.std()

 Sales
Company 
FB75.660426
GOOG56.568542
MSFT152.735065

最小值: python by_comp.min()

| | Person | Sales | | ——- | ——- | —– | | Company | | | | FB | Carl | 243 | | GOOG | Charlie | 120 | | MSFT | Amy | 124 | 最大值:python by_comp.max()

| | Person | Sales | | ——- | ——- | —– | | Company | | | | FB | Sarah | 350 | | GOOG | Sam | 200 | | MSFT | Vanessa | 340 | 计数:python by_comp.count()

 PersonSales
Company  
FB22
GOOG22
MSFT22

描述分析(等同于数据库中的功能): python by_comp.describe()

  Sales
Company  
FBcount2.000000
FBmean296.500000
FBstd75.660426
FBmin243.000000
FB25%269.750000
FB50%296.500000
FB75%323.250000
FBmax350.000000
GOOGcount2.000000
GOOGmean160.000000
GOOGstd56.568542
GOOGmin120.000000
GOOG25%140.000000
GOOG50%160.000000
GOOG75%180.000000
GOOGmax200.000000
MSFTcount2.000000
MSFTmean232.000000
MSFTstd152.735065
MSFTmin124.000000
MSFT25%178.000000
MSFT50%232.000000
MSFT75%286.000000
MSFTmax340.000000

注:由于markdown格式问题,我将公司名称全部写了出来,在编译器中公司名称其实只显示一个。

by_comp.describe().transpose() # 翻转
CompanyFB        GOOG      MSFT    
 countmeanstdmin25%50%75%maxcountmean75%maxcountmeanstdmin25%50%75%max
Sales2.0296.575.660426243.0269.75296.5323.25350.02.0160.0180.0200.02.0232.0152.735065124.0178.0232.0286.0340.0
by_comp.describe().transpose()['GOOG']

也可以翻转一个公司的数据,我就不打印出来了

Merging, Joining, and Concatenating(归并,连接,级联)

这是三个主要的进行数据合并的方法,其中几种join的区别我就不详细介绍了,主要简单介绍一下这三种方法的差别

Concatenation(级联)

最基本的连接DF的方法,注意连接的DF维度一定要相同,可以通过axis参数来设置级联的位置,默认为0(在row的后面连接)

首先我们先建立三个DF

import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                        'B': ['B0', 'B1', 'B2', 'B3'],
                        'C': ['C0', 'C1', 'C2', 'C3'],
                        'D': ['D0', 'D1', 'D2', 'D3']},
                        index=[0, 1, 2, 3])
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
                        'B': ['B4', 'B5', 'B6', 'B7'],
                        'C': ['C4', 'C5', 'C6', 'C7'],
                        'D': ['D4', 'D5', 'D6', 'D7']},
                         index=[4, 5, 6, 7])
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
                        'B': ['B8', 'B9', 'B10', 'B11'],
                        'C': ['C8', 'C9', 'C10', 'C11'],
                        'D': ['D8', 'D9', 'D10', 'D11']},
                        index=[8, 9, 10, 11])
df1
 ABCD
0A0B0C0D0
1A1B1C1D1
2A2B2C2D2
3A3B3C3D3
df2
 ABCD
4A4B4C4D4
5A5B5C5D5
6A6B6C6D6
7A7B7C7D7
df3
 ABCD
8A8B8C8D8
9A9B9C9D9
10A10B10C10D10
11A11B11C11D11
pd.concat([df1,df2,df3])
 ABCD
0A0B0C0D0
1A1B1C1D1
2A2B2C2D2
3A3B3C3D3
4A4B4C4D4
5A5B5C5D5
6A6B6C6D6
7A7B7C7D7
8A8B8C8D8
9A9B9C9D9
10A10B10C10D10
11A11B11C11D11
pd.concat([df1,df2,df3],axis=1) # 通过column相连
 ABCDABCDABCD
0A0B0C0D0NaNNaNNaNNaNNaNNaNNaNNaN
1A1B1C1D1NaNNaNNaNNaNNaNNaNNaNNaN
2A2B2C2D2NaNNaNNaNNaNNaNNaNNaNNaN
3A3B3C3D3NaNNaNNaNNaNNaNNaNNaNNaN
4NaNNaNNaNNaNA4B4C4D4NaNNaNNaNNaN
5NaNNaNNaNNaNA5B5C5D5NaNNaNNaNNaN
6NaNNaNNaNNaNA6B6C6D6NaNNaNNaNNaN
7NaNNaNNaNNaNA7B7C7D7NaNNaNNaNNaN
8NaNNaNNaNNaNNaNNaNNaNNaNA8B8C8D8
9NaNNaNNaNNaNNaNNaNNaNNaNA9B9C9D9
10NaNNaNNaNNaNNaNNaNNaNNaNA10B10C10D10
11NaNNaNNaNNaNNaNNaNNaNNaNA11B11C11D11

Merging

合并有点像SQL语句里的join,需要keys(在两个DF中key可以是相同的Series也可以是不同的)进行合并 与join的区别是merge的key是通过相似的column(在实际问题中),并且两个合并的表没有主从之分,而join的index是指row的index,有一个为主一个为副。

left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                     'A': ['A0', 'A1', 'A2', 'A3'],
                     'B': ['B0', 'B1', 'B2', 'B3']})

right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                          'C': ['C0', 'C1', 'C2', 'C3'],
                          'D': ['D0', 'D1', 'D2', 'D3']})    
left
 ABkey
0A0B0K0
1A1B1K1
2A2B2K2
3A3B3K3
right
 CDkey
0C0D0K0
1C1D1K1
2C2D2K2
3C3D3K3
pd.merge(left,right,how='inner',on='key')
 ABkeyCD
0A0B0K0C0D0
1A1B1K1C1D1
2A2B2K2C2D2
3A3B3K3C3D3

下面我们使用key不同的两个表

left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
                     'key2': ['K0', 'K1', 'K0', 'K1'],
                        'A': ['A0', 'A1', 'A2', 'A3'],
                        'B': ['B0', 'B1', 'B2', 'B3']})

right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                               'key2': ['K0', 'K0', 'K0', 'K0'],
                                  'C': ['C0', 'C1', 'C2', 'C3'],
                                  'D': ['D0', 'D1', 'D2', 'D3']})
pd.merge(left, right, on=['key1', 'key2'])
 ABkey1key2CD
0A0B0K0K0C0D0
1A2B2K1K0C1D1
2A2B2K1K0C2D2
pd.merge(right,left,  on=['key1', 'key2'])  # 注意左右交换的结果
 CDkey1key2AB
0C0D0K0K0A0B0
1C1D1K1K0A2B2
2C2D2K1K0A2B2
pd.merge(left, right, how='outer', on=['key1', 'key2'])
 ABkey1key2CD
0A0B0K0K0C0D0
1A1B1K0K1NaNNaN
2A2B2K1K0C1D1
3A2B2K1K0C2D2
4A3B3K2K1NaNNaN
5NaNNaNK2K0C3D3
pd.merge(left, right, how='right', on=['key1', 'key2'])
 ABkey1key2CD
0A0B0K0K0C0D0
1A2B2K1K0C1D1
2A2B2K1K0C2D2
3NaNNaNK2K0C3D3
pd.merge(left, right, how='left', on=['key1', 'key2'])
 ABkey1key2CD
0A0B0K0K0C0D0
1A1B1K0K1NaNNaN
2A2B2K1K0C1D1
3A2B2K1K0C2D2
4A3B3K2K1NaNNaN

Joining

Joining是将两个不同index的DF合并成一个单一的DF,所以要求大部分column相同

left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
                     'B': ['B0', 'B1', 'B2']},
                      index=['K0', 'K1', 'K2'])

right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],
                    'D': ['D0', 'D2', 'D3']},
                      index=['K0', 'K2', 'K3'])
left.join(right)
 ABCD
K0A0B0C0D0
K1A1B1NaNNaN
K2A2B2C2D2
left.join(right, how='outer')
 ABCD
K0A0B0C0D0
K1A1B1NaNNaN
K2A2B2C2D2
K3NaNNaNC3D3

Operations(运算)

哈,终于说到运算操作啦。其中很多方法与R语言的很像。

import pandas as pd
df = pd.DataFrame({'col1':[1,2,3,4],'col2':[444,555,666,444],'col3':['abc','def','ghi','xyz']})
df.head()
 col1col2col3
01444abc
12555def
23666ghi
34444xyz

各种Unique值

df['col2'].unique()  # 找出唯一的值并返回array
array([444, 555, 666])
df['col2'].nunique()  # 返回唯一值的个数
3
df['col2'].value_counts()  # 计数
444    2
555    1
666    1
Name: col2, dtype: int64

选择数据

# 从复合条件中选择数据
newdf = df[(df['col1']>2) & (df['col2']==444)]
newdf
 col1col2col3
34444xyz

应用方程或函数

def times2(x):
    return x*2
df['col1'].apply(times2)  # 通过apply对DF使用自定义函数
0    2
1    4
2    6
3    8
Name: col1, dtype: int64
df['col3'].apply(len)
0    3
1    3
2    3
3    3
Name: col3, dtype: int64
df['col1'].sum()
10 ### 永久性删除一个column
del df['col1']

df
 col2col3
0444abc
1555def
2666ghi
3444xyz

得到column或者index名称

df.columns
    Index(['col2', 'col3'], dtype='object')
df.index
    RangeIndex(start=0, stop=4, step=1)

排序

df
 col2col3
0444abc
1555def
2666ghi
3444xyz
df.sort_values(by='col2') #inplace=False 默认
 col2col3
0444abc
3444xyz
1555def
2666ghi

判空

df.isnull()
 col2col3
0FalseFalse
1FalseFalse
2FalseFalse
3FalseFalse
# Drop rows with NaN Values
df.dropna()
 col2col3
0444abc
1555def
2666ghi
3444xyz

替换NaN

import numpy as np
df = pd.DataFrame({'col1':[1,2,3,np.nan],
                   'col2':[np.nan,555,666,444],
                   'col3':['abc','def','ghi','xyz']})
df.head()
 col1col2col3
01.0NaNabc
12.0555.0def
23.0666.0ghi
3NaN444.0xyz
df.fillna('FILL')
 col1col2col3
01FILLabc
12555def
23666ghi
3FILL444xyz

建立一个基准表,挺有意思的

data = {'A':['foo','foo','foo','bar','bar','bar'],
     'B':['one','one','two','two','one','one'],
       'C':['x','y','x','y','x','y'],
       'D':[1,3,2,5,4,1]}

df = pd.DataFrame(data)

df
 ABCD
0fooonex1
1foooney3
2footwox2
3bartwoy5
4baronex4
5baroney1
df.pivot_table(values='D',index=['A', 'B'],columns=['C'])
 Cxy
AB  
barone4.01.0
bartwoNaN5.0
fooone1.03.0
footwo2.0NaN

数据输入与输出

pandas需要用 pd.read_ methods可以读取各种类型的数据哦!!

import numpy as np
import pandas as pd

## CSV

CSV 输入

df = pd.read_csv('example') # 文件最好在相同目录下,不在的话需要指定文件路径
df
 abcd
00123
14567
2891011
312131415

CSV 输出

df.to_csv('example',index=False)

## Excel Pandas 仅仅针对Data进行输入,不能输入图像或者公式,否则会报错

Excel 输入

pd.read_excel('Excel_Sample.xlsx',sheetname='Sheet1') # 注意需要指明哪个sheet
 abcd
00123
14567
2891011
312131415

Excel 输出

df.to_excel('Excel_Sample.xlsx',sheet_name='Sheet1')

## HTML

需要先安装Python的html5库支持

pip install lxml
pip install html5lib
pip install BeautifulSoup4  # 这个我很喜欢,写一下简单的爬虫时候比较好用

HTML 输入

Pandas read_html 将会自动读取网页中的表格并且返回一个包含DataFrame的List对象

df = pd.read_html('http://www.fdic.gov/bank/individual/failed/banklist.html')

df[0]

数据太多了我就不列出来了,大家可以自己试试

HTML 输出

df.to_html(‘banklist.html’) # 注意一定要扩展名

SQL语句

一般不需要用pandas直接对数据库的数据进行读取。由于安全考虑和独立性的原因。 但是pandas有 pandas.io.sql 模块可以对数据库进行数据读取,但是要有合适的API

以下是一些常用的功能:

  • read_sql_table(table_name, con[, schema, …]) 读取数据库中的表到DF中
  • read_sql_query(sql, con[, index_col, …]) 读取Query进DF
  • read_sql(sql, con[, index_col, …]) 读取表或者query进DF
  • DataFrame.to_sql(name, con[, flavor, …]) 将DF中的记录导入数据库

以下给出一个简单的例子:

from sqlalchemy import create_engine

engine = create_engine('sqlite:///:memory:') # Python默认使用sqlite数据库
df.to_sql('data', engine)
sql_df = pd.read_sql('data',con=engine)

sql_df
 indexabcd
000123
114567
22891011
3312131415

转载于:https://my.oschina.net/thinwonton/blog/3082474

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值