Pandas基础学习

1318-卜同学

发表文章数:13

热门标签

,
首页 » 数据科学库 » 正文

Pandas基础

pandas学习
numpy已经能够很好地处理数据,能够结合matplotlib解决数据分析的问题,那么pandas的优势在什么地方呢?
numpy能够处理处理数值型数据,但是这还不够很多时候,数据除了数值之外,还有字符串,时间序列
pandas除了处理数值之外(基于numpy),还能够处理其他类型的数据。 pandas的基础是numpy,图形库matplotlib:负责数据的可视化。
pandas的常用数据类型:
(1).Series 一维,带标签数组(索引)
(2).DataFrame 二维Series容器,比如表格。

使用ipython解析器,因为ipython解析器要比python解析器的显示更规整一些,查看运行结果是更加方便,容易。
要想使用ipython就必须安装jupyter工具。

交互模式(脚本 shell 模式)运行ipython

如果已成功安装python(pycharm)和jupyter工具,则进入命令窗口(win+R或者开始运行,输入cmd),
(1). 在cmd窗口输入:python进入python交互运行模式,
窗口会显示 >>> “提示符”
Pandas基础学习Ctrl+Z结束,quit()命令结束

(2). 输入ipython则进入ipython交互模式。
Pandas基础学习在ipython交互模式下,运行显示的结郭比较规整
quit()命令结束交互模式。

In [1]: import numpy as np

In [2]: import numpy.random as randn

In [3]: d={i:randn() for i in range(8)}
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-0692e2e1b79b> in <module>
----> 1 d={i:randn() for i in range(8)}

<ipython-input-3-0692e2e1b79b> in <dictcomp>(.0)
----> 1 d={i:randn() for i in range(8)}

TypeError: 'module' object is not callable

In [4]: from numpy.random import randn

In [5]:  d={i:randn() for i in range(8)}

In [6]: d
Out[6]:
{0: 1.059199896491215,
 1: 1.583725141440042,
 2: -1.262484177384237,
 3: -0.9688941484603147,
 4: 0.015154208512829413,
 5: -1.0683523514922675,
 6: 0.30253628988842346,
 7: -0.18685444139460056}

而在pycharm下则显示的明显没有ipython的规整

# 
import numpy as np
from numpy.random import randn
d={i:randn() for i in range(8)}
print(d)

Out:
{0: 0.8194002788566326, 1: -0.14297673587686452, 2: -1.0669802316888382, 3: 1.125494674360911, 4: -1.3472517354717095, 5: -1.2918718351877023, 6: 0.13861933507577837, 7: 0.15243821759815337}

ipython交互模式下的操作

(1). Tab键自动补全功能,输入不完全的语句可以按Tab键自动不去。
(2). ? 语句后加?可以直接查看介绍。
(3). 魔术命令 , % run;%timeit ;%quickref 显示快速参考文档

# 魔术命令
In [12]: a=np.random.randn(100,100)

In [13]: a
Out[13]:
array([[-0.40577222,  2.17038852, -1.92296381, ...,  1.98053336,
        -0.29864811, -0.56587034],
       [ 1.50038884,  0.50043991,  0.17477338, ...,  1.05126063,
        -0.10830632, -1.61186024],
       [ 0.55860138, -1.49434068, -1.20842341, ..., -2.01999406,
         0.89039864,  0.29454504],
       ...,
       [ 0.21105772, -0.15652719, -0.45746598, ...,  0.50922929,
         0.67107441, -2.47356408],
       [ 0.68633042,  0.75618497, -1.59462906, ...,  0.80811895,
         2.32310437, -0.4099147 ],
       [ 1.32717416,  1.63987943,  0.10111943, ..., -0.76419958,
        -1.00964615,  0.73981121]])

In [14]: %timeit a.dot(a)
128 µs ± 14.8 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)

ipython notebook

在web上进行探索性编程,内联图片显示。在cmd命令下输入ipython notebook即可进入jupyter网页进行编程。显示如下的图片。new——python3就会新建
Pandas基础学习重命名文件如下图
Pandas基础学习

交互模式下Numpy使用

In [1]: import numpy as np

In [2]: a=np.array([1,23,45,100])

In [3]: a
Out[3]: array([  1,  23,  45, 100])

In [4]: a.shape
Out[4]: (4,)

In [5]: a.reshape(2,2)
Out[5]:
array([[  1,  23],
       [ 45, 100]])

In [6]: a.reshape(4,)
Out[6]: array([  1,  23,  45, 100])

In [7]: a.dtype
Out[7]: dtype('int32')

In [8]: a[3]
Out[8]: 100

In [9]: b=np.array([1,2,3],[4,5,6])
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-9-3a7463a9f89e> in <module>
----> 1 b=np.array([1,2,3],[4,5,6])

TypeError: data type not understood

In [10]: b=np.array([1,2,3],[4,5,6])
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-10-3a7463a9f89e> in <module>
----> 1 b=np.array([1,2,3],[4,5,6])

TypeError: data type not understood

In [11]: b=np.array([[1,2,3],[4,5,6]])

In [12]: b
Out[12]:
array([[1, 2, 3],
       [4, 5, 6]])

In [13]: b=np.array([[1,2,3],[4,5,6]]) #两个中括号

In [14]: np.ones(2,2)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-14-378611d040c8> in <module>
----> 1 np.ones(2,2)

C:/Program Files/Anaconda/lib/site-packages/numpy/core/numeric.py in ones(shape, dtype, order)
    205
    206     """
--> 207     a = empty(shape, dtype, order)
    208     multiarray.copyto(a, 1, casting='unsafe')
    209     return a

TypeError: data type not understood

In [15]: c=np.zeros(2,2)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-15-d258320492ee> in <module>
----> 1 c=np.zeros(2,2)

TypeError: data type not understood

In [16]: c=np.zeros((2,2))

In [17]: c
Out[17]:
array([[0., 0.],
       [0., 0.]])

In [18]: c=np.zeros((2,2,3))

In [19]: c
Out[19]:
array([[[0., 0., 0.],
        [0., 0., 0.]],

       [[0., 0., 0.],
        [0., 0., 0.]]])

In [20]: c[1]=1

In [21]: c
Out[21]:
array([[[0., 0., 0.],
        [0., 0., 0.]],

       [[1., 1., 1.],
        [1., 1., 1.]]])

In [22]: c[1,0,0]=5

In [23]: c
Out[23]:
array([[[0., 0., 0.],
        [0., 0., 0.]],

       [[5., 1., 1.],
        [1., 1., 1.]]])

In [24]: a>0
Out[24]: array([ True,  True,  True,  True])

In [25]: c>0
Out[25]:
array([[[False, False, False],
        [False, False, False]],

       [[ True,  True,  True],
        [ True,  True,  True]]])

In [26]: idc=c>0

In [27]: c(idc)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-27-be3590c838db> in <module>
----> 1 c(idc)

TypeError: 'numpy.ndarray' object is not callable

In [28]: c[idc]
Out[28]: array([5., 1., 1., 1., 1., 1.])

In [29]: x=np.array([1,2],[3,4])
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-29-645a69fe232b> in <module>
----> 1 x=np.array([1,2],[3,4])

TypeError: data type not understood

In [30]: x=np.array([[1,2],[3,4]])

In [31]: x
Out[31]:
array([[1, 2],
       [3, 4]])

In [32]: y=np.range(5,9).reshape(2,2)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-32-6debcf69dbae> in <module>
----> 1 y=np.range(5,9).reshape(2,2)

C:/Program Files/Anaconda/lib/site-packages/numpy/__init__.py in __getattr__(attr)
    218             else:
    219                 raise AttributeError("module {!r} has no attribute "
--> 220                                      "{!r}".format(__name__, attr))
    221
    222         def __dir__():

AttributeError: module 'numpy' has no attribute 'range'

In [33]: y=np.arange(5,9).reshape(2,2)

In [34]: y
Out[34]:
array([[5, 6],
       [7, 8]])

In [35]: x+y
Out[35]:
array([[ 6,  8],
       [10, 12]])

In [36]: x/y
Out[36]:
array([[0.2       , 0.33333333],
       [0.42857143, 0.5       ]])

In [37]: x*y
Out[37]:
array([[ 5, 12],
       [21, 32]])

In [38]: x.T
Out[38]:
array([[1, 3],
       [2, 4]])

In [39]: np.linespace(1,10)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-39-2ee41bffacfc> in <module>
----> 1 np.linespace(1,10)

C:/Program Files/Anaconda/lib/site-packages/numpy/__init__.py in __getattr__(attr)
    218             else:
    219                 raise AttributeError("module {!r} has no attribute "
--> 220                                      "{!r}".format(__name__, attr))
    221
    222         def __dir__():

AttributeError: module 'numpy' has no attribute 'linespace'

In [40]: np.linspace(1,10)
Out[40]:
array([ 1.        ,  1.18367347,  1.36734694,  1.55102041,  1.73469388,
        1.91836735,  2.10204082,  2.28571429,  2.46938776,  2.65306122,
        2.83673469,  3.02040816,  3.20408163,  3.3877551 ,  3.57142857,
        3.75510204,  3.93877551,  4.12244898,  4.30612245,  4.48979592,
        4.67346939,  4.85714286,  5.04081633,  5.2244898 ,  5.40816327,
        5.59183673,  5.7755102 ,  5.95918367,  6.14285714,  6.32653061,
        6.51020408,  6.69387755,  6.87755102,  7.06122449,  7.24489796,
        7.42857143,  7.6122449 ,  7.79591837,  7.97959184,  8.16326531,
        8.34693878,  8.53061224,  8.71428571,  8.89795918,  9.08163265,
        9.26530612,  9.44897959,  9.63265306,  9.81632653, 10.        ])

In [41]:  np.linspace(1,10,num=150)
Out[41]:
array([ 1.        ,  1.06040268,  1.12080537,  1.18120805,  1.24161074,
        1.30201342,  1.36241611,  1.42281879,  1.48322148,  1.54362416,
        1.60402685,  1.66442953,  1.72483221,  1.7852349 ,  1.84563758,
        1.90604027,  1.96644295,  2.02684564,  2.08724832,  2.14765101,
        2.20805369,  2.26845638,  2.32885906,  2.38926174,  2.44966443,
        2.51006711,  2.5704698 ,  2.63087248,  2.69127517,  2.75167785,
        2.81208054,  2.87248322,  2.93288591,  2.99328859,  3.05369128,
        3.11409396,  3.17449664,  3.23489933,  3.29530201,  3.3557047 ,
        3.41610738,  3.47651007,  3.53691275,  3.59731544,  3.65771812,
        3.71812081,  3.77852349,  3.83892617,  3.89932886,  3.95973154,
        4.02013423,  4.08053691,  4.1409396 ,  4.20134228,  4.26174497,
        4.32214765,  4.38255034,  4.44295302,  4.5033557 ,  4.56375839,
        4.62416107,  4.68456376,  4.74496644,  4.80536913,  4.86577181,
        4.9261745 ,  4.98657718,  5.04697987,  5.10738255,  5.16778523,
        5.22818792,  5.2885906 ,  5.34899329,  5.40939597,  5.46979866,
        5.53020134,  5.59060403,  5.65100671,  5.7114094 ,  5.77181208,
        5.83221477,  5.89261745,  5.95302013,  6.01342282,  6.0738255 ,
        6.13422819,  6.19463087,  6.25503356,  6.31543624,  6.37583893,
        6.43624161,  6.4966443 ,  6.55704698,  6.61744966,  6.67785235,
        6.73825503,  6.79865772,  6.8590604 ,  6.91946309,  6.97986577,
        7.04026846,  7.10067114,  7.16107383,  7.22147651,  7.28187919,
        7.34228188,  7.40268456,  7.46308725,  7.52348993,  7.58389262,
        7.6442953 ,  7.70469799,  7.76510067,  7.82550336,  7.88590604,
        7.94630872,  8.00671141,  8.06711409,  8.12751678,  8.18791946,
        8.24832215,  8.30872483,  8.36912752,  8.4295302 ,  8.48993289,
        8.55033557,  8.61073826,  8.67114094,  8.73154362,  8.79194631,
        8.85234899,  8.91275168,  8.97315436,  9.03355705,  9.09395973,
        9.15436242,  9.2147651 ,  9.27516779,  9.33557047,  9.39597315,
        9.45637584,  9.51677852,  9.57718121,  9.63758389,  9.69798658,
        9.75838926,  9.81879195,  9.87919463,  9.93959732, 10.        ])

In [42]: y=np.sin(x)

In [43]: y
Out[43]:
array([[ 0.84147098,  0.90929743],
       [ 0.14112001, -0.7568025 ]])

In [44]: x=np.linspace(1,10,num=50)

In [45]: y=np.sin(x)

In [46]: y
Out[46]:
array([ 0.84147098,  0.92599909,  0.97937546,  0.99980446,  0.98659884,
        0.94020283,  0.86217727,  0.75514703,  0.62271272,  0.46932961,
        0.30015769,  0.1208881 , -0.06244832, -0.2436839 , -0.41672165,
       -0.57574039, -0.71539052, -0.83097406, -0.91860262, -0.97532829,
       -0.99924273, -0.98954144, -0.94655078, -0.87171701, -0.76755763,
       -0.63757668, -0.48614689, -0.31836252, -0.13986806,  0.04333173,
        0.2250738 ,  0.3992441 ,  0.55998336,  0.7018841 ,  0.82017261,
        0.91086952,  0.97092368,  0.9983148 ,  0.99212141,  0.95255185,
        0.8809373 ,  0.77968695,  0.65220699,  0.50278601,  0.33645069,
        0.15879677, -0.02419927, -0.20638121, -0.38162024, -0.54402111])

Pandas基础功能简介

建立一维/二维数据

Series是一个列表,列表的每一项都有一个称之为index的索引(如:a、b、c…),和一个与之对应的值
DataFrame是一个二维数组。

# 
In [1]: s=pd.Series([1,2,4,np.NaN])

In [2]: s
Out[2]:
0    1.0
1    2.0
2    4.0
3    NaN
dtype: float64

In [3]: dates=pd.date_range('20201211',periods=6) #以时间建立一维数列
In [4]: dates
Out[4]:
DatetimeIndex(['2020-12-11', '2020-12-12', '2020-12-13', '2020-12-14',
               '2020-12-15', '2020-12-16', '2020-12-17', '2020-12-18'],
              dtype='datetime64[ns]', freq='D')
In [5]: data=pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))
In [6]: data
Out[6]:
                   A         B         C         D
2020-12-11 -0.482722  0.325262 -0.038669  0.145112
2020-12-12  0.412925 -0.306084 -2.201006  0.927988
2020-12-13 -1.453748  2.233564 -0.811292  1.437694
2020-12-14 -0.069594  0.467055 -0.108015 -0.814236
2020-12-15 -1.890018 -0.899248 -0.121936 -0.396289
2020-12-16  1.073631  0.003384 -0.218497 -0.019094

In [7]: data.shape
Out[7]: (6, 4)
In [8]: data.values #是values非value
Out[8]:
array([[-0.48272225,  0.32526236, -0.03866882,  0.14511232],
       [ 0.41292533, -0.30608384, -2.20100595,  0.92798834],
       [-1.45374805,  2.23356444, -0.81129242,  1.43769422],
       [-0.06959352,  0.46705485, -0.10801501, -0.81423562],
       [-1.89001812, -0.89924797, -0.12193638, -0.39628875],
       [ 1.07363103,  0.00338409, -0.21849707, -0.01909439]])

字典的形式创建

d={'A':1,'B':range(4),'C':pd.Timestamp('20201211'),'D':np.arange(4)}

还可以把一个Series转化为DataFrame

df=pd.DataFrame(d) #即把上面创建的以d命名的Series转化为二维列表
    A   B   C           D
0     1     0     2020-12-11    0
1     1     1     2020-12-11    1
2     1     2     2020-12-11    2

DataFrame基础函数

df.dtype输出df的类型;
df.columns输出列;
df.T行和列互换;
df.sort_index(axis=1) 升序排列;
df.sort_index(axis=1,ascending=False) 降序排列

DataFrame的选择查看

df[‘A’] #df后面没有点,列的选择查看
df[1:3] #1行到3行的查看
df.loc[1:3] #加loc中括号内指的是行标签的字符
df.loc[:,[‘B’,‘C’]] #列表中的B和C列查看
df.loc[1:2,[‘B’,‘C’]]

网页环境下运行ipython

win+r输入cmd,输入ipython notebook即可进入,如下图
Pandas基础学习

ipython notebook环境下pandas学习

#导入所需的库
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#创建表格
dates=pd.date_range('20201229',periods=6)
df=pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD')) 
df

关键语句介绍:
df1=df.reindex(index=dates[0:4],columns=list(df.columns)+[‘E’]) 重新定义index索引,增加一列 ‘E’;
df1.loc[dates[1:3],‘E’]=2 1到2行E列数字改为2 #[1:3]包头部包尾;
df1.dropna()丢掉NaN的行;
df1.fillna(‘5’) 含义NaN的改为5;
pd.isnull(df1) 判断语句有NaN的位置为True;
pd.isnull(df1).any()判断列中有没有NaN 有为True
pd.isnull(df1).any().any()判断整个表格中有无NaN
df1.mean()按列求平均值
df1.mean(axis=1)按行求平均值
df1.cumsum()按行和列主管求累加值

s=pd.Series([1,3,5,np.NaN,6,8],index=dates).shift(2)

创建s以为数组

df.sub(s,axis=‘index’) df每列减去s 含有NaN的不参与计算结果为NaN;
df.apply(np.cumsum) 每一列的逐项相加;
df.apply(lambda x: x.max()-x.min())每一列的最大值和最小值想减;

s=pd.Series(np.random.randint(10,20,size=20))
s

s.value_counts() 该函数用于计算随机产生的数字中相同数字出现的次数;
df1=pd.concat([df.iloc[:3],df.iloc[3:7],df.iloc[7:]]) #小括号中为双中括号,df.iloc[:3] 表示前三行,df.iloc[3:7] 表示4到7行(从0计算包头不包尾),

left=pd.DataFrame({'key':['foo','foo'],'lval':[1,2]})
right=pd.DataFrame({'key':['foo','foo'],'lval':[4,5]})

pd.merge(left,right,on=‘key’) 融合函数

s=pd.Series(np.random.randint(1,5,size=4),index=list('ABCD'))

df.append(s,ignore_index=True) 增加一行

df=pd.DataFrame({'A': ['FOO','FOO','FOO','DOO',
                      'DOO','FOO','DOO','DOO'],
                 'B': ["one","one","one","two","three","three","four","five"],
                 'C': np.random.randn(8),
                 'D': np.random.randn(8)}) # 结束一个key和value后的逗号

df.groupby(‘C’).sum() 敢于C行分类的函数
df.groupby([‘A’,‘B’]).sum() 先分A后分B
df.groupby([‘B’,‘A’]).sum() 先分B后分A

序列基本功能
S.No. 属性或方法 描述
1 axes 返回行轴标签的列表。
2 dtype 返回对象的dtype。
3 empty 如果series为空,则返回True。
4 ndim 根据定义1返回基础数据的维度数。
5 size 返回基础数据中元素的数量。
6 values 将该序列作为ndarray返回。
7 head() 返回前n行。
8 tail() 返回最后n行。

DataFrame基本功能

DataFrame Basic功能中的重要属性或方法。
S.No. 属性或方法 描述
1 Ť 转置行和列。
2 axes 以行轴标签和列轴标签作为唯一成员返回列表。
3 dtypes 返回此对象中的dtypes。
4 empty 如果NDFrame完全为空[没有项目],则为true; 如果任何轴的长度为0。
5 ndim 轴/阵列尺寸的数量。
6 shape 返回表示DataFrame维度的元组。
7 size NDFrame中的元素数目。
8 values NDFrame的Numpy表示。
9 head() 返回前n行。
10 tail() 返回最后n行。

可视化

Series和DataFrame上的这个功能只是 matplotlib 库plot() 方法的简单包装。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10,4),index=pd.date_range('1/1/2000',
   periods=10), columns=list('ABCD'))

df.plot()

输出如下
Pandas基础学习

Pandas电影数据分析

电影数据分析
准备工作

从网站 files.grouplens.org/datasets/movielens/ml-1m.zip下载 MovieLens 1M Dataset 数据。
数据说明

参阅数据介绍文件 README.txt
利用 Pandas 分析电影评分数据

数据读取
数据合并
统计电影平均得分
统计活跃电影 -> 获得评分的次数越多说明电影越活跃
女生最喜欢的电影排行榜
男生最喜欢的电影排行榜
男女生评分差距最大的电影 -> 某类电影女生喜欢,但男生不喜欢
最具争议的电影排行榜 -> 评分的方差最大

解压后如下图所
Pandas基础学习

读取文件前5行

user_names = ['user_id', 'gender', 'age', 'occupation', 'zip']
users = pd.read_table('ml-1m/users.dat', sep='::', header=None, names=user_names, engine='python')

rating_names = ['user_id', 'movie_id', 'rating', 'timestamp']
ratings = pd.read_table('ml-1m/ratings.dat', sep='::', header=None, names=rating_names, engine='python')

movie_names = ['movie_id', 'title', 'genres']
movies = pd.read_table('ml-1m/movies.dat', sep='::', header=None, names=movie_names, engine='python')

数据合并

data = pd.merge(pd.merge(users, ratings), movies)
len(data)
data.head(5)

输出

user_id    gender  age     occupation  zip     movie_id    rating  timestamp   title   genres
0     1     F   1     10    48067     1193  5     978300760     One Flew Over the Cuckoo's Nest (1975)  Drama
1     2     M   56    16    70072     1193  5     978298413     One Flew Over the Cuckoo's Nest (1975)  Drama
2     12    M   25    12    32793     1193  4     978220179     One Flew Over the Cuckoo's Nest (1975)  Drama
3     15    M   25    7     22903     1193  4     978199279     One Flew Over the Cuckoo's Nest (1975)  Drama
4     17    M   50    1     95350     1193  5     978158471     One Flew Over the Cuckoo's Nest (1975)  Drama

读取指定行

data[data.user_id == 1]

按性别查看各个电影的平均评分

用pivot_table()函数

mean_ratings_gender = data.pivot_table(values='rating', index='title', columns='gender', aggfunc='mean')
mean_ratings_gender.head(5)
#值为rating,索引为标题,列索引为性别,aggfunc取平均

输出5行为

gender     F   M
title       
$1,000,000 Duck (1971)  3.375000  2.761905
'Night Mother (1986)    3.388889  3.352941
'Til There Was You (1997)   2.675676  2.733333
'burbs, The (1989)   2.793478  2.962085
...And Justice for All (1979)    3.828571  3.689024

男女意见想差最大的电影 -> 价值观/品味冲突

mean_ratings_gender['diff'] = mean_ratings_gender.F - mean_ratings_gender.M
mean_ratings_gender.head(5)
#加一列diff,值取为对应性别的打分差值
mean_ratings_gender.sort_values(by='diff', ascending=True).head(5) #升序排列,前5
mean_ratings_gender.sort_values(by='diff', ascending=False).head(5) #降序排列,前5

输出

gender     F   M   diff
title           
Tigrero: A Film That Was Never Made (1994)   1     4.333333  -3.333333
Neon Bible, The (1995)   1     4.000000  -3.000000
Enfer, L' (1994)     1     3.750000  -2.750000
Stalingrad (1993)   1     3.593750  -2.593750

求电影得分、热度的代码

ratings_by_movie_title = data.groupby('title').size() # size()用于求评分的次数,表征活跃度
ratings_by_movie_title.head(5) 
top_ratings = ratings_by_movie_title[ratings_by_movie_title > 1000] # size()大于1000的
top_10_ratings = top_ratings.sort_values(ascending=False).head(10)
top_10_ratings
mean_ratings = data.pivot_table(values='rating', index='title', aggfunc='mean') # 求电影平均得分
top_20_mean_ratings = mean_ratings.sort_values(ascending=False).head(20)
top_20_mean_ratings 

Pandas核心的数据结构

Series

Series 是一维带标签的数组,数组里可以放任意的数据(整数,浮点数,字符串,Python Object)。其基本的创建函数是:

s = pd.Series(data, index=index)

其中 index 是一个列表,用来作为数据的标签。data 可以是不同的数据类型:

Python 字典
ndarray 对象
一个标量值,如 5
# 从 ndaray 创建
s1 = pd.Series(np.random.randn(5)) #index默认为01,2......
s2 = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e']) #index为a,b,c.....
# 从字典创建
d = {'a' : 0., 'b' : 1., 'd' : 3}
s = pd.Series(d, index=list('abcd'))
# 从标量创建
pd.Series(3, index=list('abcde') #列标签对应的值均为3

DataFrame

DataFrame 是二维带行标签和列标签的数组。可以把 DataFrame 想你成一个 Excel 表格或一个 SQL 数据库的表格,还可以相像成是一个 Series 对象字典。它是 Pandas 里最常用的数据结构。

创建 DataFrame 的基本格式是:

df = pd.DataFrame(data, index=index, columns=columns)

其中 index 是行标签,columns 是列标签,data 可以是下面的数据:

由一维 numpy 数组,list,Series 构成的字典
二维 numpy 数组
一个 Series
另外的 DataFrame 对象
# 从字典创建
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
     'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
pd.DataFrame(d)
# 从结构化数据中创建
data1 = [(1, 2.2, 'Hello'), (2, 3., "World")]
pd.DataFrame(data1) #默认的行列标签0,1,2....
pd.DataFrame(data1, index=['first', 'second'], columns=['A', 'B', 'C']) #重新标定
# 从字典列表创建
data2 = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
pd.DataFrame(data2)
#从元组字典创建
d1 = {('a', 'b'): {('A', 'B'): 1, ('A', 'C'): 2},
     ('a', 'a'): {('A', 'C'): 3, ('A', 'B'): 4},
     ('a', 'c'): {('A', 'B'): 5, ('A', 'C'): 6},
     ('b', 'a'): {('A', 'C'): 7, ('A', 'B'): 8},
     ('b', 'b'): {('A', 'D'): 9, ('A', 'B'): 10}}
pd.DataFrame(d1)
#从 Series 创建
s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
pd.DataFrame(s)

Pandas基础运算

重新索引

Pandas 重新索引(Reindexing),重新索引会更改DataFrame的行标签和列标签。重新索引意味着符合数据以匹配特定轴上的一组给定的标签。

可以通过索引来实现多个操作

重新排序现有数据以匹配一组新的标签。
在没有标签数据的标签位置插入缺失值(NA)标记。
# 从 ndaray 创建
s = pd.Series([1, 3, 5, 6, 8], index=list('acefh'))
s.reindex(list('abcdefgh')) #缺失处为Na
s.reindex(list('abcdefgh'), fill_value=0) 缺失处为0

填充方法

reindex()采用可选参数方法,它是一个填充方法,其值如下:

pad/ffill – 向前填充值
bfill/backfill – 向后填充值
nearest – 从最近的索引值填充

其他常见操作

# 从 ndaray 创建
df = pd.DataFrame(np.arange(12).reshape(4, 3), index=['one', 'two', 'three', 'four'], columns=list('ABC'))
df
df.drop('A') #行操作
df2 = df.drop(['two', 'four'], axis=1) #列操作
df - df.loc['one'] #广播运算
df.sort_values(by='one') #排序运算
标签:

未经允许不得转载:作者:1318-卜同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《Pandas基础学习》 发布于2021-02-18

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录