快速入门pandas使用
一小时快速入门Pandas
什么是Pandas?
pandas与numpy,scipy一样,都是优秀的python开源数据分析库,为python编程语言提供高性能,易于使用的数据结构和数据分析工具。
Pandas安装
如果你已经安装了Anaconda,那么你无需安装Pandas,直接进入下一步即可。
如果你没有安装Anaconda,你也可使用如下方法安装pandas,强烈推荐安装Anaconda。
python3 -m pip install --upgrade pandas
pip install Pandas
更多了解
详见Pandas中文网,本教程也均来自此:Pandas 中文 (pypandas.cn)
导入Pandas库
无论你使用什么进行Pandas的数据分析,在程序的开头,我们首先要像numpy一样导入库,这样我们才能使用来自pandas中的丰富功能
import pandas as pd
这样我们就已经成功导入了pandas,我们可以开始快速入门pandas了!
生成Pandas对象
在Pandas中,我们最常见的操作对象就是Series和Dataframe这两个对象,我们首先开始创建Series对象。
使用pd.Series方法,通过传入参数的方式可以创建Series,结果以列表方式返回
s = pd.Series([1, 3, 5, np.nan, 6, 8])
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 8.0
dtype: float64
接着我们创建Dataframe对象,要创建DataFrame对象,我们要指定索引Index和值,我们首先生成dates,然后让index等于dates,再传入我们的值就可以得到dataframe对象
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(df)
得到:
A B C D
2013-01-01 0.469112 -0.282863 -1.509059 -1.135632
2013-01-02 1.212112 -0.173215 0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929 1.071804
2013-01-04 0.721555 -0.706771 -1.039575 0.271860
2013-01-05 -0.424972 0.567020 0.276232 -1.087401
2013-01-06 -0.673690 0.113648 -1.478427 0.524988
我们还可以用Series 字典对象生成 DataFrame
df2 = pd.DataFrame({'A': 1.,
...: 'B': pd.Timestamp('20130102'),
...: 'C': pd.Series(1, index=list(range(4)), dtype='float32'),
...: 'D': np.array([3] * 4, dtype='int32'),
...: 'E': pd.Categorical(["test", "train", "test", "train"]),
...: 'F': 'foo'})
...:
得到:
A B C D E F
0 1.0 2013-01-02 1.0 3 test foo
1 1.0 2013-01-02 1.0 3 train foo
2 1.0 2013-01-02 1.0 3 test foo
3 1.0 2013-01-02 1.0 3 train foo
我们可以通过dtypes方法查看dataframe的数据类型组成
A float64
B datetime64[ns]
C float32
D int32
E category
F object
dtype: object
查看dataframe数据
我们首先使用head方法查看头部数据
df.head()
得到头部数据:
A B C D
2013-01-01 0.469112 -0.282863 -1.509059 -1.135632
2013-01-02 1.212112 -0.173215 0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929 1.071804
2013-01-04 0.721555 -0.706771 -1.039575 0.271860
2013-01-05 -0.424972 0.567020 0.276232 -1.087401
使用tail查看尾部数据
df.tail(3)
得到尾部数据:
A B C D
2013-01-04 0.721555 -0.706771 -1.039575 0.271860
2013-01-05 -0.424972 0.567020 0.276232 -1.087401
2013-01-06 -0.673690 0.113648 -1.478427 0.524988
显示索引与列名,我们使用Index和columns方法
df.index
索引:
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
'2013-01-05', '2013-01-06'],
dtype='datetime64[ns]', freq='D')
columns方法:
df.columns
#返回
Index(['A', 'B', 'C', 'D'], dtype='object')
Pandas 和 NumPy 的本质区别:NumPy 数组只有一种数据类型,DataFrame 每列的数据类型各不相同
DataFrame.to_numpy方法可以将dataframe格式转换为Numpy格式,在处理某些数据类型的时候,numpy确实要比pandas要快得多。
提醒
DataFrame.to_numpy的输出不包含行索引和列标签。
describe方法可以快速查看数据的统计摘要
df.describe()
A B C D
count 6.000000 6.000000 6.000000 6.000000
mean 0.073711 -0.431125 -0.687758 -0.233103
std 0.843157 0.922818 0.779887 0.973118
min -0.861849 -2.104569 -1.509059 -1.135632
25% -0.611510 -0.600794 -1.368714 -1.076610
50% 0.022070 -0.228039 -0.767252 -0.386188
75% 0.658444 0.041933 -0.034326 0.461706
max 1.212112 0.567020 0.276232 1.071804
转置数据
df.T
按轴排序(axis=0是行,axis=1是列)
df.sort_index(axis=1, ascending=False)
D C B A
2013-01-01 -1.135632 -1.509059 -0.282863 0.469112
2013-01-02 -1.044236 0.119209 -0.173215 1.212112
2013-01-03 1.071804 -0.494929 -2.104569 -0.861849
2013-01-04 0.271860 -1.039575 -0.706771 0.721555
2013-01-05 -1.087401 0.276232 0.567020 -0.424972
2013-01-06 0.524988 -1.478427 0.113648 -0.673690
按值排序
df.sort_values(by='B')
A B C D
2013-01-03 -0.861849 -2.104569 -0.494929 1.071804
2013-01-04 0.721555 -0.706771 -1.039575 0.271860
2013-01-01 0.469112 -0.282863 -1.509059 -1.135632
2013-01-02 1.212112 -0.173215 0.119209 -1.044236
2013-01-06 -0.673690 0.113648 -1.478427 0.524988
2013-01-05 -0.424972 0.567020 0.276232 -1.087401
这里以后会介绍推荐优化过的 Pandas 数据访问方法:
.at、.iat、.loc和.iloc
缺失值
Pandas 主要用 np.nan 表示缺失数据, 计算时,默认不包含空值。
重建索引(reindex)可以更改、添加、删除指定轴的索引,并返回数据副本,即不更改原数据。
简而言之,reindex可以快速找出我们需要的数据,且其操作不是在原数据上直接进行的。
df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])
注意这里的index只保留了0到4行。然后在原始columns的基础上新加了E这一列
df1.loc[dates[0]:dates[1], 'E'] = 1
然后使用loc(可以理解为切片,与numpy切片的概念是相同的)函数,使在第一行第二行的E这一列的值为1
A B C D F E
2013-01-01 0.000000 0.000000 -1.509059 5 NaN 1.0
2013-01-02 1.212112 -0.173215 0.119209 5 1.0 1.0
2013-01-03 -0.861849 -2.104569 -0.494929 5 2.0 NaN
2013-01-04 0.721555 -0.706771 -1.039575 5 3.0 NaN
然后我们删除所有含有缺失值的行
df1.dropna(how='any')
dropna是pandas中删除缺失值的函数,里面的参数any是删除所有带有缺失值的行
A B C D F E
2013-01-02 1.212112 -0.173215 0.119209 5 1.0 1.0
我们还需要一个用来填充缺失值的函数fillna
df1.fillna(value=5)
A B C D F E
2013-01-01 0.000000 0.000000 -1.509059 5 5.0 1.0
2013-01-02 1.212112 -0.173215 0.119209 5 1.0 1.0
2013-01-03 -0.861849 -2.104569 -0.494929 5 2.0 5.0
2013-01-04 0.721555 -0.706771 -1.039575 5 3.0 5.0
这里将value设置为5,意思是让所有的缺失值填充为5
我们通过isna方法可以快速判断值是否为缺失值,该方法返回一个布尔矩阵
pd.isna(df1)
A B C D F E
2013-01-01 False False False False True False
2013-01-02 False False False False False False
2013-01-03 False False False False False True
2013-01-04 False False False False False True
统计
我们通常使用mean方法来进行描述性统计
df.mean()
A -0.004474
B -0.383981
C -0.687758
D 5.000000
F 3.000000
dtype: float64
在另一个轴(即,行)上执行同样的操作:
df.mean(1)
2013-01-01 0.872735
2013-01-02 1.431621
2013-01-03 0.707731
2013-01-04 1.395042
2013-01-05 1.883656
2013-01-06 1.592306
Freq: D, dtype: float64
合并(Merge)
Pandas 提供了多种将 Series、DataFrame 对象组合在一起的功能,用索引与关联代数功能的多种设置逻辑可执行连接(join)与合并(merge)操作。
concat方法
concat经常用于连接 Pandas 对象
我们首先将原来完整的数据进行切片
df = pd.DataFrame(np.random.randn(10, 4)) #生成一个随机dataframe
pieces = [df[:3], df[3:7], df[7:]] #切片分组
然后我们使用concat函数,里面传入pieces切片,concat将自动按顺序为我们合并
pd.concat(pieces)
0 1 2 3
0 -0.548702 1.467327 -1.015962 -0.483075
1 1.637550 -1.217659 -0.291519 -1.745505
2 -0.263952 0.991460 -0.919069 0.266046
3 -0.709661 1.669052 1.037882 -1.705775
4 -0.919854 -0.042379 1.247642 -0.009920
5 0.290213 0.495767 0.362949 1.548106
6 -1.131345 -0.089329 0.337863 -0.945867
7 -0.932132 1.956030 0.017587 -0.016692
8 -0.575247 0.254161 -1.143704 0.215897
9 1.193555 -0.077118 -0.408530 -0.862495
连接(join)
下面是sql风格的连接操作:
left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})
right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})
left:
key lval
0 foo 1
1 foo 2
right:
key rval
0 foo 4
1 foo 5
pd.merge(left, right, on='key')
#得到
key lval rval
0 foo 1 4
1 foo 1 5
2 foo 2 4
3 foo 2 5
追加(Append)
为 DataFrame 追加行
df = pd.DataFrame(np.random.randn(8, 4), columns=['A', 'B', 'C', 'D'])
df
A B C D
0 1.346061 1.511763 1.627081 -0.990582
1 -0.441652 1.211526 0.268520 0.024580
2 -1.577585 0.396823 -0.105381 -0.532532
3 1.453749 1.208843 -0.080952 -0.264610
4 -0.727965 -0.589346 0.339969 -0.693205
5 -0.339355 0.593616 0.884345 1.591431
6 0.141809 0.220390 0.435589 0.192451
7 -0.096701 0.803351 1.715071 -0.708758
s = df.iloc[3]
df.append(s, ignore_index=True)
A B C D
0 1.346061 1.511763 1.627081 -0.990582
1 -0.441652 1.211526 0.268520 0.024580
2 -1.577585 0.396823 -0.105381 -0.532532
3 1.453749 1.208843 -0.080952 -0.264610
4 -0.727965 -0.589346 0.339969 -0.693205
5 -0.339355 0.593616 0.884345 1.591431
6 0.141809 0.220390 0.435589 0.192451
7 -0.096701 0.803351 1.715071 -0.708758
8 1.453749 1.208843 -0.080952 -0.264610
在这个例子中,我们首先创建一个dataframe然后,将使用切片将前三列取走,最后使用追加函数将第四列追加在前三列的末尾。
分组(Grouping)
- 分割:按条件把数据分割成多组;
- 应用:为每组单独应用函数;
- 组合:将处理结果组合成一个数据结构。
In [91]: df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar',
....: 'foo', 'bar', 'foo', 'foo'],
....: 'B': ['one', 'one', 'two', 'three',
....: 'two', 'two', 'one', 'three'],
....: 'C': np.random.randn(8),
....: 'D': np.random.randn(8)})
....:
df
A B C D
0 foo one -1.202872 -0.055224
1 bar one -1.814470 2.395985
2 foo two 1.018601 1.552825
3 bar three -0.595447 0.166599
4 foo two 1.395433 0.047609
5 bar two -0.392670 -0.136473
6 foo one 0.007207 -0.561757
7 foo three 1.928123 -1.623033
生成了一含有不同数据类型的dataframe
先分组,再用 sum函数计算每组的汇总数据:
df.groupby('A').sum()
C D
A
bar -2.802588 2.42611
foo 3.146492 -0.63958
多列分组后,生成多层索引,也可以应用 sum函数:
df.groupby(['A', 'B']).sum()
C D
A B
bar one -1.814470 2.395985
three -0.595447 0.166599
two -0.392670 -0.136473
foo one -1.195665 -0.616981
three 1.928123 -1.623033
two 2.414034 1.600434
Pandas时间序列
pandas时间序列不是基础操作的重点,想进一步深入了解的伙伴可以继续阅读
十分钟入门 Pandas | Pandas 中文 (pypandas.cn)和《利用python进行数据分析》这本书,我在以后也会陆续更新这本书的内容。
总结
这些知识大概一个小时即可阅读完毕,这些都是pandas最基础的操作,加下来我会陆续总结在数学建模实战中的Pandas操作,在八月后期我也会更新赛题的数据分析操作,也算对自己学习经验的实践。
感谢您阅读到这里,我非常希望和大家深入技术交流,我自己现在的技术也是很菜,多交流多学习才有可能进步。

浙公网安备 33010602011771号