> 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属性的方法有:
- values -------------------------获取元素
- index --------------------------获取索引
- columns ----------------------获取列名
- dtype --------------------------获取类型
- size ----------------------------获取元素个数
- ndim ---------------------------获取维度数
- 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)<ipython-input-71-0cd5616b5540> in <module>()
----> 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 continue855
--> 856 retval = getattr(retval, self.name)._getitem_axis(key, axis=i)857 858 return retvalE:\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)<ipython-input-76-a037ccf4ddc6> in <module>()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 TrueValueError: 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)<ipython-input-16-7fbd59a87c7e> in <module>()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,日期<built-in method date of Timestamp object at 0x00000219C8059390>
年2019,月4,日1,时21,秒0,日期<built-in method date of Timestamp object at 0x00000219C8059408>
年2019,月1,日2,时9,秒0,日期<built-in method date of Timestamp object at 0x00000219C8059390>
年2019,月3,日1,时15,秒0,日期<built-in method date of Timestamp object at 0x00000219C8059408>
年2018,月10,日3,时9,秒0,日期<built-in method date of Timestamp object at 0x00000219C8059390>
data['评论时间'][1].year # 注意series数据没有.year等方法,即不可以直接用series.year这种想要图简单的方法获取所有的年份。
2019
data['评论时间'][:].year # 例如
---------------------------------------------------------------------------AttributeError Traceback (most recent call last)<ipython-input-58-302a60aee1cd> in <module>()
----> 1 data['评论时间'][:].yearE:\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