pandas库学习笔记

> dataframe与series

pandas中有两种常用的数据结构,分别是dataframe和series两种。

dataframe数据结构

import numpy as np
import pandas as pd
dataframe = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],index = ['No.1','No.2','No.3'],columns = ['a','b','c'])
dataframe
a b c
No.1 1 2 3
No.2 4 5 6
No.3 7 8 9

series数据结构

series = pd.Series([1,2,3,4,5],index = ['No1','No2','No3','No4','No5'])
series
No1    1
No2    2
No3    3
No4    4
No5    5
dtype: int64

> dataframe的常规属性

查看dataframe属性的方法有:

  1. values -------------------------获取元素
  2. index --------------------------获取索引
  3. columns ----------------------获取列名
  4. dtype --------------------------获取类型
  5. size ----------------------------获取元素个数
  6. ndim ---------------------------获取维度数
  7. shape -------------------------获取数据形状

# values
dataframe.values
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]], dtype=int64)
# values类型
type(dataframe.values)
numpy.ndarray
# index
dataframe.index
Index(['No.1', 'No.2', 'No.3'], dtype='object')
# columns
dataframe.columns
Index(['a', 'b', 'c'], dtype='object')
# dtype
dataframe.dtypes
a    int64
b    int64
c    int64
dtype: object
# dtype返回类型是 series
type(dataframe.dtypes) 
pandas.core.series.Series
# size
dataframe.size
9
# size返回类型
type(dataframe.size)
numpy.int32
# ndim
dataframe.ndim
2
# shape    返回类型是tuple
dataframe.shape
(3, 3)

> dataframe的增删查改操作

> 查

▲普通方法

字典访问形式获取单列数据

dataframe['a']   # 或者写成dataframe.a
No.1    1
No.2    4
No.3    7
Name: a, dtype: int64

tips。。。。不可以使用dataframe[‘行索引名称’]。括号中默认是列索引名称。

获取单列多行数据

dataframe['a'][:2]
No.1    1
No.2    4
Name: a, dtype: int64

获取多列数据

dataframe[['a','b']]   # 将多列数据以List的数据类型传入
a b
No.1 1 2
No.2 4 5
No.3 7 8

获取多行数据

dataframe[:][:2]      # 与单列多行数据的获取方法有着异曲同工之妙
a b c
No.1 1 2 3
No.2 4 5 6

head方法获取首部数据

'''默认获取首5行,但是当数据不够五行的时候,并不会报错,此时会取最大行数。'''
dataframe.head()   # dataframe的形状是(3,3)
a b c
No.1 1 2 3
No.2 4 5 6
No.3 7 8 9

tail方法获取尾部数据

#获取倒数1行数据
dataframe.tail(1)    # 注意传入数字表示获取的数据的行数 ,默认deault获取5行。
a b c
No.3 7 8 9

>>★★iloc与loc切片方法

loc

# loc切片方法--------------根据索引名称的切片方法。传入的必须是索引名称,否则没有办法执行。
dataframe.loc[:,'b']           # 很类似matlab中矩阵的切片方法 dataframe.iloc[行索引名称,列索引名称]
No.1    2
No.2    5
No.3    8
Name: b, dtype: int64

iloc

# iloc切片方法--------------根据索引位置的切片方法。dataframe.iloc[行索引位置,列索引位置]
dataframe.iloc[:,1]
No.1    2
No.2    5
No.3    8
Name: b, dtype: int64

>>★多列切片

# loc多列切片    dataframe.loc[:,[列索引名称1,列索引名称2,.....,列索引名称n]]
dataframe.loc[:,['a','b']]   # 多个列索引名称以列表的形式传入
a b
No.1 1 2
No.2 4 5
No.3 7 8
# iloc多列切片   dataframe.iloc[:,[列索引位置1,列索引位置2,......,列索引位置n]]
dataframe.iloc[:,[0,1]]
a b
No.1 1 2
No.2 4 5
No.3 7 8

★★条件切片

loc条件切片

dataframe
a b c
No.1 1 2 3
No.2 4 5 6
No.3 7 8 9
dataframe.loc[dataframe['a']>2,:] # 获取dataframe中a列数值大于2的数据。
a b c
No.2 4 5 6
No.3 7 8 9
dataframe['a']>2   # 观察得知,a列中数值大于2的只有第二和第三个满足。
No.1    False
No.2     True
No.3     True
Name: a, dtype: bool
dataframe.loc[dataframe['b']>5]  # 获取dataframe中b列数据大于5的数据。
a b c
No.3 7 8 9

归纳一下
dataframe.loc[条件,:] # 其中条件数据中数值类型是bool型,数据结构可以是series或者list。但是需要注意当条件数据是series类型的时候,条件数据index必须与待切片数据一致,否则会报错,index不匹配。如下例。

dataframe.loc['No.1']>2  # 此时index为a,b,c,与待切片数据不一致。
a    False
b    False
c     True
Name: No.1, dtype: bool
dataframe['a']>2 # 该条件数据index为No.1,No.2,No.3 与待切片数据index一致。
No.1    False
No.2     True
No.3     True
Name: a, dtype: bool
dataframe.loc[dataframe.loc['No.1']>2,:]  #  报错
---------------------------------------------------------------------------

IndexingError                             Traceback (most recent call last)

 in ()
----> 1 dataframe.loc[dataframe.loc['No.1']>2,:]


E:\anaconda3.5\lib\site-packages\pandas\core\indexing.py in __getitem__(self, key)
   1323             except (KeyError, IndexError):
   1324                 pass
-> 1325             return self._getitem_tuple(key)
   1326         else:
   1327             key = com._apply_if_callable(key, self.obj)


E:\anaconda3.5\lib\site-packages\pandas\core\indexing.py in _getitem_tuple(self, tup)
    854                 continue
    855 
--> 856             retval = getattr(retval, self.name)._getitem_axis(key, axis=i)
    857 
    858         return retval


E:\anaconda3.5\lib\site-packages\pandas\core\indexing.py in _getitem_axis(self, key, axis)
   1506             return self._get_slice_axis(key, axis=axis)
   1507         elif is_bool_indexer(key):
-> 1508             return self._getbool_axis(key, axis=axis)
   1509         elif is_list_like_indexer(key):
   1510 


E:\anaconda3.5\lib\site-packages\pandas\core\indexing.py in _getbool_axis(self, key, axis)
   1339     def _getbool_axis(self, key, axis=0):
   1340         labels = self.obj._get_axis(axis)
-> 1341         key = check_bool_indexer(labels, key)
   1342         inds, = key.nonzero()
   1343         try:


E:\anaconda3.5\lib\site-packages\pandas\core\indexing.py in check_bool_indexer(ax, key)
   1937         mask = isnull(result._values)
   1938         if mask.any():
-> 1939             raise IndexingError('Unalignable boolean Series provided as '
   1940                                 'indexer (index of the boolean Series and of '
   1941                                 'the indexed object do not match')


IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match
dataframe.loc[dataframe['a']>2,:]   # 正常
a b c
No.2 4 5 6
No.3 7 8 9

iloc条件切片

# dataframe.iloc[条件,条件]     条件不可以是series数据。可以是array。
dataframe.iloc[dataframe['a']>2,:]   # 报错
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

 in ()
      1 # dataframe.iloc[条件,条件]     条件不可以是series数据。可以是array。
----> 2 dataframe.iloc[dataframe['a']>2,:]   # 报错


E:\anaconda3.5\lib\site-packages\pandas\core\indexing.py in __getitem__(self, key)
   1323             except (KeyError, IndexError):
   1324                 pass
-> 1325             return self._getitem_tuple(key)
   1326         else:
   1327             key = com._apply_if_callable(key, self.obj)


E:\anaconda3.5\lib\site-packages\pandas\core\indexing.py in _getitem_tuple(self, tup)
   1660     def _getitem_tuple(self, tup):
   1661 
-> 1662         self._has_valid_tuple(tup)
   1663         try:
   1664             return self._getitem_lowerdim(tup)


E:\anaconda3.5\lib\site-packages\pandas\core\indexing.py in _has_valid_tuple(self, key)
    187             if i >= self.obj.ndim:
    188                 raise IndexingError('Too many indexers')
--> 189             if not self._has_valid_type(k, i):
    190                 raise ValueError("Location based indexing can only have [%s] "
    191                                  "types" % self._valid_types)


E:\anaconda3.5\lib\site-packages\pandas\core\indexing.py in _has_valid_type(self, key, axis)
   1588                                               "indexing on an integer type "
   1589                                               "is not available")
-> 1590                 raise ValueError("iLocation based boolean indexing cannot use "
   1591                                  "an indexable as a mask")
   1592             return True


ValueError: iLocation based boolean indexing cannot use an indexable as a mask
dataframe.iloc[dataframe['a'].values>2,:]   
a b c
No.2 4 5 6
No.3 7 8 9
dataframe.iloc[dataframe.loc['No.1'].values>2,:]   # 因为iloc方法中条件不可以是series,因此不需要与待切片数据index或者columns一致。
a b c
No.3 7 8 9

loc使用区间切割时,区间前后都为闭。而iloc使用区间切割的时候前闭后开。

dataframe.loc[:,'a':'b']  # 包含a 和 b
a b
No.1 1 2
No.2 4 5
No.3 7 8
dataframe.iloc[:,0:1]   # 只包含一个
a
No.1 1
No.2 4
No.3 7

loc与iloc方法,当只传入一个索引的时候,默认是行索引。
dataframe.loc[列索引]是不可以的

> 改

dataframe中改变数据原理就是将数据提取出来,然后重新赋值。

dataframe.iloc[1,1]  # 原本的数据
5
dataframe.iloc[1,1] = 4 
dataframe.iloc[1,1]   # 改变后的数据
4

> 增

dataframe中增加数据,类似与dict,只要新建一个列索引,然后在赋值即可。

dataframe['add'] = ['a','d','d']
dataframe    # 增加一列后的数据
a b c add
No.1 1 2 3 a
No.2 4 4 6 d
No.3 7 8 9 d

> 删

删除某行或者某列,需使用pandas的drop方法。

# dataframe.drop(labels,axis,inplace)    labels表示待删除的行列标签名称,inplace表示是否对原数据执行,默认为false.inplace为true的时候,将会改变原数据
# axis 默认为0。
dataframe.drop('add',axis = 1)  # 删除add列。但是并为改变原dataframe数据
a b c
No.1 1 2 3
No.2 4 4 6
No.3 7 8 9
dataframe  # 未发生改变
a b c add
No.1 1 2 3 a
No.2 4 4 6 d
No.3 7 8 9 d
dataframe.drop('add',axis = 1,inplace=True)  # 不返回数据,就地执行
dataframe   # 数据发生改变。
a b c
No.1 1 2 3
No.2 4 4 6
No.3 7 8 9

> 描述分析dataframe数据

数值型描述分析统计
min/max/mean/std/var/cov/median
ptp 极差
sem 标准误差
skew 样本偏度
kurt 样本峰度
count 非空值数目
quantitle 四分位数
describe 描述性统计
mad 平均绝对误差
mode 众数

dataframe
a b c
No.1 1 2 3
No.2 4 5 6
No.3 7 8 9
# decribe描述统计
dataframe.describe()
a b c
count 3.0 3.0 3.0
mean 4.0 5.0 6.0
std 3.0 3.0 3.0
min 1.0 2.0 3.0
25% 2.5 3.5 4.5
50% 4.0 5.0 6.0
75% 5.5 6.5 7.5
max 7.0 8.0 9.0
# 最大值max   默认axis = 0。
dataframe.max()
a    7
b    8
c    9
dtype: int64
dataframe.max(axis=1)
No.1    3
No.2    6
No.3    9
dtype: int64
#mean平均值    axis的deault为0
dataframe.mean()
a    4.0
b    5.0
c    6.0
dtype: float64
dataframe.mean(axis=1)
No.1    2.0
No.2    5.0
No.3    8.0
dtype: float64
# 非空数目值count   也可以设置axis
dataframe.count()
No.1    3
No.2    3
No.3    3
dtype: int64
# 众数              axis默认为0
dataframe.mode()
0 1 2
No.1 1 2 3
No.2 4 5 6
No.3 7 8 9

类别特征的描述分析统计

# 类别特征统计使用value_counts方法  注意dataframe对象没有value_counts方法
dataframe.value_counts()
---------------------------------------------------------------------------

AttributeError                            Traceback (most recent call last)

 in ()
      1 # 类别特征统计使用value_counts方法  注意dataframe对象没有value_counts方法
----> 2 dataframe.value_counts()


E:\anaconda3.5\lib\site-packages\pandas\core\generic.py in __getattr__(self, name)
   3079             if name in self._info_axis:
   3080                 return self[name]
-> 3081             return object.__getattribute__(self, name)
   3082 
   3083     def __setattr__(self, name, value):


AttributeError: 'DataFrame' object has no attribute 'value_counts'
# 可以这样来设置类别统计   返回数据是series类型。
dataframe['a'].value_counts()
7    1
1    1
4    1
Name: a, dtype: int64

> 转换与处理时间序列数据

pandas中与时间相关的类有很多。 Timestamp 最基础的时间类,表示某个时间。 Period 表示某个时间跨度或者某个时间段。 Timedelta 表示不同单位的时间,例如1h,20min,30s。 DatatimeIndex 一组Timestamp构成的Index,可以用来作为series或者Dataframe的索引。 PeriodIndex Period构成的index,可以用来作为series或者dataframe的索引。 TimedeltaIndex Timedelta构成的index,可以用来作为series或者dataframe的索引。
# 最常用的是Timestamp。着重介绍。
data = pd.read_excel(r'E:\Dell.xlsx')

pandas中pd.to_datatime()方法,可以将数据转为datatime类型数据。

data['评论时间'].head()
0    2018-10-18 07:16
1    2019-04-01 21:54
2    2019-01-02 09:46
3    2019-03-01 15:52
4    2018-10-03 09:40
Name: 评论时间, dtype: object
data.dtypes
评论时间    object
订单类型    object
评论内容    object
追加评论    object
dtype: object
data['评论时间'] = pd.to_datetime(data['评论时间'])
data.dtypes   # 评论时间转换为datatime64类型了
评论时间    datetime64[ns]
订单类型            object
评论内容            object
追加评论            object
dtype: object
# 将时间字符串转换为DatetimeIndex和PeriodIndex
dateindex = pd.DatetimeIndex(data['评论时间'])
type(dateindex)
pandas.core.indexes.datetimes.DatetimeIndex
periodIndex = pd.PeriodIndex(data['评论时间'],freq = 'S')  #  必须要指定freq。否则会报错。freq表示时间间隔的频率。
type(periodIndex)
pandas.core.indexes.period.PeriodIndex

提取时间序列数据信息
year/month/day/hour/minute/second/date/time(时间)
week 一年中第几周
quarter 季节
weekofyear 一年中第几周
dayofyear 一年中的第几周
weekday 一周中第几天
weekdayname 星期名称
is_leap_year 是否是闰年

data['评论时间'].head()
0   2018-10-18 07:16:00
1   2019-04-01 21:54:00
2   2019-01-02 09:46:00
3   2019-03-01 15:52:00
4   2018-10-03 09:40:00
Name: 评论时间, dtype: datetime64[ns]
for i in data['评论时间'].head():
    print('年{},月{},日{},时{},秒{},日期{}'.format(i.year,i.month,i.day,i.hour,i.second,i.date))
年2018,月10,日18,时7,秒0,日期
年2019,月4,日1,时21,秒0,日期
年2019,月1,日2,时9,秒0,日期
年2019,月3,日1,时15,秒0,日期
年2018,月10,日3,时9,秒0,日期
data['评论时间'][1].year      # 注意series数据没有.year等方法,即不可以直接用series.year这种想要图简单的方法获取所有的年份。
2019
data['评论时间'][:].year   # 例如
---------------------------------------------------------------------------

AttributeError                            Traceback (most recent call last)

 in ()
----> 1 data['评论时间'][:].year


E:\anaconda3.5\lib\site-packages\pandas\core\generic.py in __getattr__(self, name)
   3079             if name in self._info_axis:
   3080                 return self[name]
-> 3081             return object.__getattribute__(self, name)
   3082 
   3083     def __setattr__(self, name, value):


AttributeError: 'Series' object has no attribute 'year'
data['评论时间'][1].weekday_name   #星期名称
'Monday'

加减时间

某一时间点加减一段时间。这其中就要涉及到Timedelta。Timedelta中单位说明

名称 说明
weeks 星期
days
hours/minutes/seconds xx
milliseconds 毫秒
# 原来数据
data['评论时间'][1]
Timestamp('2019-04-01 21:54:00')
data['评论时间'][1]-pd.Timedelta(days =1)  # 减去一天后的时间。
Timestamp('2019-03-31 21:54:00')
# 两个时间点也也可以相减(Timestamp)
data['评论时间'][1]-data['评论时间'][2]
Timedelta('89 days 12:08:00')

> 分组聚合方法

依据某个或者某几个字段对数据集进行分组,并对各组应用一个函数,无论是聚合还是转换,都是数据分析的常用操作。

pandas提供了一个灵活高效的groupby方法,配合agg及apply方法能够实现分组聚合的操作。groupby方法提供的是分组聚合步骤中的拆分功能能够根据字段对数据进行分组。

data.head(15)
评论时间 订单类型 评论内容 追加评论
0 2018-10-18 07:16:00 U2717D【27英寸2K】 京东物流确实神速,次日达,包装完好,宝贝好沉,辛苦快递小哥了!宝贝做工确实不错,看上去很奢侈... None
1 2019-04-01 21:54:00 S2419HM【23.8英寸纤薄时尚】 屏幕很清晰 边框很窄很舒服 hdr效果相当不错 使用过程发现一些问题 玩英雄联盟中途会自动关... 不知你们开hdr再开游戏的时候 会不会闪屏
2 2019-01-02 09:46:00 S2719DGF【27英寸2K电竞】 显示器很不错,2k屏办公,娱乐画面看起来都清晰多了,而且用时间长眼睛也没有不适,tn屏刚拿来... None
3 2019-03-01 15:52:00 U2417H【23.8英寸升降旋转】 有了这个屏幕极大提高了办公效率,可以上下左右调整角度,高度也很合适,比起低头看笔记本电脑对颈... None
4 2018-10-03 09:40:00 U2518DR【25英寸2K】 质量没的说,首先是支架,左右上下移动很方便,质量厚重。其次,2k显示,由于我没有好的显卡,只... None
5 2017-12-09 17:17:00 U2417H【23.8英寸】 满意,色彩比较准,看着也不累,边框缝隙不小。有轻微颗粒感。边框很赞,支架很厉害。外观好看。 None
6 2019-03-21 20:53:00 U2415【24英寸16:10升降旋转】 一分钱一分货,这是我想要的显示器,显示效果太好了,没有漏光啥的,连接surface pro太... None
7 2018-08-25 15:53:00 U2518DR【25英寸2K】 NaN None
8 2017-12-22 18:03:00 U2417H【23.8英寸】 美滋滋,24寸体验很不错,27寸就大了,色彩确实不错,挺细腻的,插口也很多,usb3.0也能... None
9 2018-11-25 18:57:00 U2717D【27英寸2K】 从U2311H到U2717D,戴尔显示器真的很不错,质量没问题,显示器非常不错,色彩很好,U... None
10 2018-10-18 07:16:00 U2717D【27英寸2K】 京东物流确实神速,次日达,包装完好,宝贝好沉,辛苦快递小哥了!宝贝做工确实不错,看上去很奢侈... None
11 2019-04-01 21:54:00 S2419HM【23.8英寸纤薄时尚】 屏幕很清晰 边框很窄很舒服 hdr效果相当不错 使用过程发现一些问题 玩英雄联盟中途会自动关... 不知你们开hdr再开游戏的时候 会不会闪屏
12 2019-01-02 09:46:00 S2719DGF【27英寸2K电竞】 显示器很不错,2k屏办公,娱乐画面看起来都清晰多了,而且用时间长眼睛也没有不适,tn屏刚拿来... None
13 2019-03-01 15:52:00 U2417H【23.8英寸升降旋转】 有了这个屏幕极大提高了办公效率,可以上下左右调整角度,高度也很合适,比起低头看笔记本电脑对颈... None
14 2018-10-03 09:40:00 U2518DR【25英寸2K】 质量没的说,首先是支架,左右上下移动很方便,质量厚重。其次,2k显示,由于我没有好的显卡,只... None

GroupBy常用描述性统计方法及说明

方法名称 说明
count 计算分组的数目包括缺失值
head 返回每组的前n个值
max 返回每组的最大值
min 返回每组的最小值
mean 返回每组的平均值
median 返回每组的中位数
size 返回每组的大小
sum 返回每组的和
std 返回每组的标准差
Groupdata = data[["订单类型","评论时间"]].groupby(by="订单类型")
# count
Groupdata.count()
评论时间
订单类型
S2419HM【23.8英寸纤薄时尚】 20
S2719DGF【27英寸2K电竞】 20
U2415【24英寸16:10升降旋转】 20
U2417H【23.8英寸】 40
U2417H【23.8英寸升降旋转】 20
U2518DR【25英寸2K】 40
U2717D【27英寸2K】 40
#head
Groupdata.head(1)
订单类型 评论时间
0 U2717D【27英寸2K】 2018-10-18 07:16:00
1 S2419HM【23.8英寸纤薄时尚】 2019-04-01 21:54:00
2 S2719DGF【27英寸2K电竞】 2019-01-02 09:46:00
3 U2417H【23.8英寸升降旋转】 2019-03-01 15:52:00
4 U2518DR【25英寸2K】 2018-10-03 09:40:00
5 U2417H【23.8英寸】 2017-12-09 17:17:00
6 U2415【24英寸16:10升降旋转】 2019-03-21 20:53:00
# size
Groupdata.size()
订单类型
S2419HM【23.8英寸纤薄时尚】     20
S2719DGF【27英寸2K电竞】      20
U2415【24英寸16:10升降旋转】    20
U2417H【23.8英寸】          40
U2417H【23.8英寸升降旋转】      20
U2518DR【25英寸2K】         40
U2717D【27英寸2K】          40
dtype: int64
type(Groupdata)  # 分组的数据类型
pandas.core.groupby.DataFrameGroupBy
type(Groupdata.size())   # series类型
pandas.core.series.Series

>使用agg方法聚合数据

在pandas 0.20 版本以后,agg函数能够对DataFrame对象进行操作。

DataFrame.agg(func,axis = 0,*args, **kwargs)

参数名称 说明
func 接受list,dict,function,表示应用于每行或者每列的函数,无默认。
axis 接受0或者1.表示操作的轴向,默认为0

操作dataframe

dataframe
a b c
No.1 1 2 3
No.2 4 5 6
No.3 7 8 9
dataframe.agg(np.sum,axis = 0)  # 返回的是一个series类型的数据
a    12
b    15
c    18
dtype: int64
dataframe.agg([np.sum,np.max])  # 应用两个函数
a b c
sum 12 15 18
amax 7 8 9
dataframe.agg({
     "a":np.sum,"b":np.max,'c':np.min})   # 不同的字段用用不同的函数
a    12
b     8
c     3
dtype: int64
dataframe.agg({
     "a":[np.sum,np.max]})    # 针对指定字段应用多个函数。
a
sum 12
amax 7


在使用自定义函数时,必须多列数据同时计算,单列得出的结果异常


dataframe[‘列1’,‘列2’,…,‘列n’].agg(自定义函数,axis = 0 or 1) # 正确用法之一

>使用apply方法聚合数据

apply方法相比agg,其不可以对每个字段应用不同的函数。传入的函数只能作用于整个dataframe或者series。

DataFrame.apply(func,axis = 0,broadcast = False,raw = False,reduce = None,args = (),**kwds)

参数名称 说明
func 表示应用于每行或每列的函数
axis 代表操作的轴向
broadcast 表示是否进行广播
raw 表示是否直接将ndarray对象传递给函数。默认为False
dataframe.apply(np.mean)  # 对整个dataframe
a    4.0
b    5.0
c    6.0
dtype: float64
Groupdata['订单类型'].apply(np.sum)
订单类型
S2419HM【23.8英寸纤薄时尚】     S2419HM【23.8英寸纤薄时尚】S2419HM【23.8英寸纤薄时尚】S2419HM【...
S2719DGF【27英寸2K电竞】      S2719DGF【27英寸2K电竞】S2719DGF【27英寸2K电竞】S2719DGF【2...
U2415【24英寸16:10升降旋转】    U2415【24英寸16:10升降旋转】U2415【24英寸16:10升降旋转】U2415【...
U2417H【23.8英寸】          U2417H【23.8英寸】U2417H【23.8英寸】U2417H【23.8英寸】U241...
U2417H【23.8英寸升降旋转】      U2417H【23.8英寸升降旋转】U2417H【23.8英寸升降旋转】U2417H【23....
U2518DR【25英寸2K】         U2518DR【25英寸2K】U2518DR【25英寸2K】U2518DR【25英寸2K】U...
U2717D【27英寸2K】          U2717D【27英寸2K】U2717D【27英寸2K】U2717D【27英寸2K】U271...
Name: 订单类型, dtype: object

>使用transform方法聚合数据

transform方法能够对整个dataframe的所有元素进行操作。transform方法只有一个参数"func",表示对dataframe操作的函数。

dataframe.transform(lambda x:x*2)   #可以使用transform方法实现组内离差标准差。
a b c
No.1 2 4 6
No.2 8 10 12
No.3 14 16 18
dataframe.transform(np.max)
a    7
b    8
c    9
dtype: int64

创建透视表于交叉表

数据透视表是数据分析中常见的工作之一,根据一个或者多个键值对数据进行聚合,根据行或者列的分组键将数据划分到各个区域。在pandas中,除了可以使用groupby对数据进行分组聚合实现透视功能外还提供了更为简单的方法。

pandas.pivot_table(data,values=None,index = None,columns = None,aggfunc=‘mean’,fill_value = None,margins=False,dropna=True,margins_name = ‘All’)

参数名称 说明
data 接受dataframe,表示创建表的数据,无默认
values 接受string,用于指定要聚合的数据字段,默认使用全部数据。默认为None
index 接受string或者List,表示行分组键。默认为None
columns 接受string或者list,表示列分组键
aggfunc 接受functions,表示聚合函数。默认为mean
margins 接受boolean。表示汇总(Total)功能的开关,设置为True后,结果集中会出现名为‘ALL’的行或者列。默认为True
dropna 接受Boolean。表示是否删除全为NaN的列。默认为False
fill_value 表示填空值
pd.pivot_table(data,index = '订单类型',aggfunc=np.sum).head()  # index表示要依据的列名。这个地方不好理解。
评论时间 追加评论
订单类型
S2419HM【23.8英寸纤薄时尚】 2019-04-01 21:542019-04-01 21:542019-04-01 21:... 不知你们开hdr再开游戏的时候 会不会闪屏不知你们开hdr再开游戏的时候 会不会闪屏不知你们...
S2719DGF【27英寸2K电竞】 2019-01-02 09:462019-01-02 09:462019-01-02 09:... None None None None None None None None None N...
U2415【24英寸16:10升降旋转】 2019-03-21 20:532019-03-21 20:532019-03-21 20:... None None None None None None None None None N...
U2417H【23.8英寸】 2017-12-09 17:172017-12-22 18:032017-12-09 17:... None None None None None None None None None N...
U2417H【23.8英寸升降旋转】 2019-03-01 15:522019-03-01 15:522019-03-01 15:... None None None None None None None None None N...

values参数可以指定要显示自己关心的列。

pd.pivot_table(data,index = '订单类型',values='追加评论',aggfunc=np.sum).head()
追加评论
订单类型
S2419HM【23.8英寸纤薄时尚】 不知你们开hdr再开游戏的时候 会不会闪屏不知你们开hdr再开游戏的时候 会不会闪屏不知你们...
S2719DGF【27英寸2K电竞】 None None None None None None None None None N...
U2415【24英寸16:10升降旋转】 None None None None None None None None None N...
U2417H【23.8英寸】 None None None None None None None None None N...
U2417H【23.8英寸升降旋转】 None None None None None None None None None N...
pd.pivot_table(data,index = '订单类型',values='追加评论',aggfunc=np.sum,fill_value=0).head()
追加评论
订单类型
S2419HM【23.8英寸纤薄时尚】 不知你们开hdr再开游戏的时候 会不会闪屏不知你们开hdr再开游戏的时候 会不会闪屏不知你们...
S2719DGF【27英寸2K电竞】 None None None None None None None None None N...
U2415【24英寸16:10升降旋转】 None None None None None None None None None N...
U2417H【23.8英寸】 None None None None None None None None None N...
U2417H【23.8英寸升降旋转】 None None None None None None None None None N...

交叉表忽略不学。

ending

你可能感兴趣的:(数据分析之Pandas库学习,python,pandas)