pandas时间处理、分组聚合

import pandas as pd
import numpy as np
data=pd.read_excel(r'meal_order_detail.xlsx')
print(data.shape)
(2779, 19)
print(data.columns)
Index(['detail_id', 'order_id', 'dishes_id', 'logicprn_name',
       'parent_class_name', 'dishes_name', 'itemis_add', 'counts', 'amounts',
       'cost', 'place_order_time', 'discount_amt', 'discount_reason',
       'kick_back', 'add_inprice', 'add_info', 'bar_code', 'picture_file',
       'emp_id'],
      dtype='object')

一、时间处理:

print(data.dtypes)
detail_id                     int64
order_id                      int64
dishes_id                     int64
logicprn_name               float64
parent_class_name           float64
dishes_name                  object
itemis_add                    int64
counts                        int64
amounts                       int64
cost                        float64
place_order_time     datetime64[ns]
discount_amt                float64
discount_reason             float64
kick_back                   float64
add_inprice                   int64
add_info                    float64
bar_code                    float64
picture_file                 object
emp_id                        int64
dtype: object

为了展示字符串类型转标准时间格式,先将原来的标准时间转字符串

place_order_time=data['place_order_time'].astype('str')
print(place_order_time)
0       2016-08-01 11:05:36
1       2016-08-01 11:07:07
2       2016-08-01 11:07:40
3       2016-08-01 11:11:11
4       2016-08-01 11:11:30
               ...         
2774    2016-08-10 21:56:24
2775    2016-08-10 21:56:48
2776    2016-08-10 22:01:52
2777    2016-08-10 22:03:58
2778    2016-08-10 22:04:30
Name: place_order_time, Length: 2779, dtype: object

1、将字符串类型转为标准时间格式

data['place_order_time']=pd.to_datetime(place_order_time)
print(data.head())
   detail_id  order_id  dishes_id  logicprn_name  parent_class_name  \
0       2956       417     610062            NaN                NaN   
1       2958       417     609957            NaN                NaN   
2       2961       417     609950            NaN                NaN   
3       2966       417     610038            NaN                NaN   
4       2968       417     610003            NaN                NaN   

  dishes_name  itemis_add  counts  amounts  cost    place_order_time  \
0        蒜蓉生蚝           0       1       49   NaN 2016-08-01 11:05:36   
1       蒙古烤羊腿           0       1       48   NaN 2016-08-01 11:07:07   
2        大蒜苋菜           0       1       30   NaN 2016-08-01 11:07:40   
3       芝麻烤紫菜           0       1       25   NaN 2016-08-01 11:11:11   
4         蒜香包           0       1       13   NaN 2016-08-01 11:11:30   

   discount_amt  discount_reason  kick_back  add_inprice  add_info  bar_code  \
0           NaN              NaN        NaN            0       NaN       NaN   
1           NaN              NaN        NaN            0       NaN       NaN   
2           NaN              NaN        NaN            0       NaN       NaN   
3           NaN              NaN        NaN            0       NaN       NaN   
4           NaN              NaN        NaN            0       NaN       NaN   

       picture_file  emp_id  
0  caipu/104001.jpg    1442  
1  caipu/202003.jpg    1442  
2  caipu/303001.jpg    1442  
3  caipu/105002.jpg    1442  
4  caipu/503002.jpg    1442  

2、时间类型提取

ser.dt.时间属性:
year、month、day、hour、minute、second、
date(日期)、week(一年中第几个星期)、
quarter(第几个季节)、dayofyear(一年中的第几天)、
dayofweek(一周的第几天,0开始)、is_leap_year(是否是闰年,返回布尔值)、
daysinmonth(这个月有多少天)、
month_name()(月份名)、day_name()(星期名称)

data['year']=data['place_order_time'].dt.year
print(data['place_order_time'].head())
data['place_order_time'].dt.daysinmonth
0   2016-08-01 11:05:36
1   2016-08-01 11:07:07
2   2016-08-01 11:07:40
3   2016-08-01 11:11:11
4   2016-08-01 11:11:30
Name: place_order_time, dtype: datetime64[ns]





0       31
1       31
2       31
3       31
4       31
        ..
2774    31
2775    31
2776    31
2777    31
2778    31
Name: place_order_time, Length: 2779, dtype: int64

3、时间运算

(1)标准时间加减运算

time1=data['place_order_time'].head()
#reset_index:重新设置索引,会将原来的索引加入到新列
time2=data['place_order_time'].tail().reset_index()
print(time2)
time2=time2['place_order_time']
print(time1)
print(time2)
# 索引不同不能减因此重置索引
   index    place_order_time
0   2774 2016-08-10 21:56:24
1   2775 2016-08-10 21:56:48
2   2776 2016-08-10 22:01:52
3   2777 2016-08-10 22:03:58
4   2778 2016-08-10 22:04:30
0   2016-08-01 11:05:36
1   2016-08-01 11:07:07
2   2016-08-01 11:07:40
3   2016-08-01 11:11:11
4   2016-08-01 11:11:30
Name: place_order_time, dtype: datetime64[ns]
0   2016-08-10 21:56:24
1   2016-08-10 21:56:48
2   2016-08-10 22:01:52
3   2016-08-10 22:03:58
4   2016-08-10 22:04:30
Name: place_order_time, dtype: datetime64[ns]
print(time2-time1)
0   9 days 10:50:48
1   9 days 10:49:41
2   9 days 10:54:12
3   9 days 10:52:47
4   9 days 10:53:00
Name: place_order_time, dtype: timedelta64[ns]

(2)整体+时间戳

weeks 星期 miliseconds 毫秒
days 天 hours 小时 minutes 分钟 seconds 秒

pd.Timedelta(days=1)
Timedelta('1 days 00:00:00')
data['place_order_time']+pd.Timedelta(hours=1)
0      2016-08-01 12:05:36
1      2016-08-01 12:07:07
2      2016-08-01 12:07:40
3      2016-08-01 12:11:11
4      2016-08-01 12:11:30
               ...        
2774   2016-08-10 22:56:24
2775   2016-08-10 22:56:48
2776   2016-08-10 23:01:52
2777   2016-08-10 23:03:58
2778   2016-08-10 23:04:30
Name: place_order_time, Length: 2779, dtype: datetime64[ns]

二、分组聚合

# 每个订单应付金额
# sort_values排序,ascending=False:降序,True(默认)升序
data.groupby(by='order_id')[['amounts','counts']].sum().sort_values(by='counts',ascending=False)
amountscounts
order_id
55795730
118665528
114694427
1026102124
39270424
.........
4923013
10291233
1054983
7031272
1064481

278 rows × 2 columns

# 如果是一维的没有列索引,所以排序的时候就不用传by
data.groupby(by='order_id')['amounts'].sum().sort_values(ascending=True)
# 但是如果amounts有两层中括号就不一样了[['amounts']]  就是二维的了,就得传by值
order_id
1064      48
1054      98
856      107
342      108
1174     110
        ... 
1148    1066
584     1121
1121    1146
408     1148
1317    1210
Name: amounts, Length: 278, dtype: int64

三、聚合

1、pandas、numpy中的统计分析方法:sum、mean、std、var

2、特殊函数完成聚合操作

# agg里面写想要的多个计算方法,
# 如果前面是数值型,就传数值型的计算方法,
# 如果是类别型就传类别性的计算方法
data[['amounts','counts']].agg([np.sum,np.mean,np.std,np.var])
amountscounts
sum125992.0000003088.000000
mean45.3371721.111191
std36.8085500.625428
var1354.8693560.391160
# 对amounts求均值,对counts求和、标准差
data[['amounts','counts']].agg({'amounts':np.mean,'counts':[np.sum,np.std]})
amountscounts
mean45.337172NaN
stdNaN0.625428
sumNaN3088.000000
# 按照订单号分组,获取每组的amounts、counts
data.groupby(by='order_id')[['amounts','counts']].agg([np.mean,np.sum])
amountscounts
meansummeansum
order_id
13732.3333331941.5000009
16552.9444449531.16666721
16648.2000002411.4000007
17136.2857142541.42857110
17734.2500001371.0000004
...............
130934.0769234431.15384615
131442.3333335081.00000012
131767.22222212101.00000018
131967.7777786101.0000009
132350.9333337641.00000015

278 rows × 4 columns

# 算完之后只获取amounts
data.groupby(by='order_id')[['amounts','counts']].agg([np.mean,np.sum])['amounts']
meansum
order_id
13732.333333194
16552.944444953
16648.200000241
17136.285714254
17734.250000137
.........
130934.076923443
131442.333333508
131767.2222221210
131967.777778610
132350.933333764

278 rows × 2 columns

四、series字符串处理

order=pd.read_csv(r'order-14.3.csv',sep=',',encoding='gbk')
print(order.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3478 entries, 0 to 3477
Data columns (total 7 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   商品ID    3478 non-null   int64  
 1   类别ID    3478 non-null   int64  
 2   门店编号    3478 non-null   object 
 3   单价      3478 non-null   float64
 4   销量      3478 non-null   float64
 5   成交时间    3478 non-null   object 
 6   订单ID    3478 non-null   object 
dtypes: float64(2), int64(2), object(3)
memory usage: 190.3+ KB
None
data=pd.read_excel(r'D:\jupyter\meal_order_detail.xlsx')
print(data.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2779 entries, 0 to 2778
Data columns (total 19 columns):
 #   Column             Non-Null Count  Dtype         
---  ------             --------------  -----         
 0   detail_id          2779 non-null   int64         
 1   order_id           2779 non-null   int64         
 2   dishes_id          2779 non-null   int64         
 3   logicprn_name      0 non-null      float64       
 4   parent_class_name  0 non-null      float64       
 5   dishes_name        2779 non-null   object        
 6   itemis_add         2779 non-null   int64         
 7   counts             2779 non-null   int64         
 8   amounts            2779 non-null   int64         
 9   cost               0 non-null      float64       
 10  place_order_time   2779 non-null   datetime64[ns]
 11  discount_amt       0 non-null      float64       
 12  discount_reason    0 non-null      float64       
 13  kick_back          0 non-null      float64       
 14  add_inprice        2779 non-null   int64         
 15  add_info           0 non-null      float64       
 16  bar_code           0 non-null      float64       
 17  picture_file       2779 non-null   object        
 18  emp_id             2779 non-null   int64         
dtypes: datetime64[ns](1), float64(8), int64(8), object(2)
memory usage: 412.6+ KB
None
data['dishes_name']
0         蒜蓉生蚝
1        蒙古烤羊腿
2         大蒜苋菜
3        芝麻烤紫菜
4          蒜香包
         ...  
2774     白饭/大碗
2775       牛尾汤
2776    意文柠檬汁 
2777      金玉良缘
2778      酸辣藕丁
Name: dishes_name, Length: 2779, dtype: object
# 去空
data['dishes_name']=data['dishes_name'].str.strip()
# 判断菜名是否包含‘番茄’,包含返回True,不包含返回False
mask=data['dishes_name'].str.contains('番茄')
data.loc[mask,'dishes_name']
9       番茄有机花菜
16        番茄甘蓝
18       番茄炖秋葵
23       番茄炖牛腩
92        番茄甘蓝
         ...  
2579     番茄炖牛腩
2584    番茄有机花菜
2620      番茄甘蓝
2717     番茄炖秋葵
2728      番茄甘蓝
Name: dishes_name, Length: 98, dtype: object

五、dataframe去重的操作

一维没有subset参数

# 一维
data['dishes_name'].drop_duplicates()
0             蒜蓉生蚝
1            蒙古烤羊腿
2             大蒜苋菜
3            芝麻烤紫菜
4              蒜香包
           ...    
1024        海带结豆腐汤
1169          冰镇花螺
1411         冬瓜炒苦瓜
1659       超人气广式肠粉
2438    百里香奶油烤紅酒牛肉
Name: dishes_name, Length: 145, dtype: object
# 二维
data.drop_duplicates(subset='dishes_name')
detail_idorder_iddishes_idlogicprn_nameparent_class_namedishes_nameitemis_addcountsamountscostplace_order_timediscount_amtdiscount_reasonkick_backadd_inpriceadd_infobar_codepicture_fileemp_id
02956417610062NaNNaN蒜蓉生蚝0149NaN2016-08-01 11:05:36NaNNaNNaN0NaNNaNcaipu/104001.jpg1442
12958417609957NaNNaN蒙古烤羊腿0148NaN2016-08-01 11:07:07NaNNaNNaN0NaNNaNcaipu/202003.jpg1442
22961417609950NaNNaN大蒜苋菜0130NaN2016-08-01 11:07:40NaNNaNNaN0NaNNaNcaipu/303001.jpg1442
32966417610038NaNNaN芝麻烤紫菜0125NaN2016-08-01 11:11:11NaNNaNNaN0NaNNaNcaipu/105002.jpg1442
42968417610003NaNNaN蒜香包0113NaN2016-08-01 11:11:30NaNNaNNaN0NaNNaNcaipu/503002.jpg1442
............................................................
10247064800610040NaNNaN海带结豆腐汤0130NaN2016-08-06 14:11:38NaNNaNNaN0NaNNaNcaipu/105004.jpg1159
11694683584610067NaNNaN冰镇花螺0135NaN2016-08-06 18:04:14NaNNaNNaN0NaNNaNcaipu/104006.jpg1487
141141151148610045NaNNaN冬瓜炒苦瓜0129NaN2016-08-06 21:23:30NaNNaNNaN0NaNNaNcaipu/305004.jpg1092
16597168812610058NaNNaN超人气广式肠粉0118NaN2016-08-07 12:13:40NaNNaNNaN0NaNNaNcaipu/604002.jpg1122
2438858165609707NaNNaN百里香奶油烤紅酒牛肉01178NaN2016-08-09 12:47:36NaNNaNNaN0NaNNaNcaipu/201001.jpg1097

145 rows × 19 columns

# 当菜名和id同时一样才算重复才删除
data.drop_duplicates(subset=['dishes_name','dishes_id'])
detail_idorder_iddishes_idlogicprn_nameparent_class_namedishes_nameitemis_addcountsamountscostplace_order_timediscount_amtdiscount_reasonkick_backadd_inpriceadd_infobar_codepicture_fileemp_id
02956417610062NaNNaN蒜蓉生蚝0149NaN2016-08-01 11:05:36NaNNaNNaN0NaNNaNcaipu/104001.jpg1442
12958417609957NaNNaN蒙古烤羊腿0148NaN2016-08-01 11:07:07NaNNaNNaN0NaNNaNcaipu/202003.jpg1442
22961417609950NaNNaN大蒜苋菜0130NaN2016-08-01 11:07:40NaNNaNNaN0NaNNaNcaipu/303001.jpg1442
32966417610038NaNNaN芝麻烤紫菜0125NaN2016-08-01 11:11:11NaNNaNNaN0NaNNaNcaipu/105002.jpg1442
42968417610003NaNNaN蒜香包0113NaN2016-08-01 11:11:30NaNNaNNaN0NaNNaNcaipu/503002.jpg1442
............................................................
10247064800610040NaNNaN海带结豆腐汤0130NaN2016-08-06 14:11:38NaNNaNNaN0NaNNaNcaipu/105004.jpg1159
11694683584610067NaNNaN冰镇花螺0135NaN2016-08-06 18:04:14NaNNaNNaN0NaNNaNcaipu/104006.jpg1487
141141151148610045NaNNaN冬瓜炒苦瓜0129NaN2016-08-06 21:23:30NaNNaNNaN0NaNNaNcaipu/305004.jpg1092
16597168812610058NaNNaN超人气广式肠粉0118NaN2016-08-07 12:13:40NaNNaNNaN0NaNNaNcaipu/604002.jpg1122
2438858165609707NaNNaN百里香奶油烤紅酒牛肉01178NaN2016-08-09 12:47:36NaNNaNNaN0NaNNaNcaipu/201001.jpg1097

146 rows × 19 columns

data.dropna(axis=1,how='all')
detail_idorder_iddishes_iddishes_nameitemis_addcountsamountsplace_order_timeadd_inpricepicture_fileemp_id
02956417610062蒜蓉生蚝01492016-08-01 11:05:360caipu/104001.jpg1442
12958417609957蒙古烤羊腿01482016-08-01 11:07:070caipu/202003.jpg1442
22961417609950大蒜苋菜01302016-08-01 11:07:400caipu/303001.jpg1442
32966417610038芝麻烤紫菜01252016-08-01 11:11:110caipu/105002.jpg1442
42968417610003蒜香包01132016-08-01 11:11:300caipu/503002.jpg1442
....................................
27746750774610011白饭/大碗01102016-08-10 21:56:240caipu/601005.jpg1138
27756742774609996牛尾汤01402016-08-10 21:56:480caipu/201006.jpg1138
27766756774609949意文柠檬汁01132016-08-10 22:01:520caipu/404005.jpg1138
27776763774610014金玉良缘01302016-08-10 22:03:580caipu/302003.jpg1138
27786764774610017酸辣藕丁01332016-08-10 22:04:300caipu/302006.jpg1138

2779 rows × 11 columns

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: pandasPython中一个非常强大的数据分析库,它提供了高效化运算和时间序列处理的功能。在数据分析中,我们经常需要对大量数据进行运算和处理pandas提供了很多高效的函数和方法,可以大大提高数据处理的效率。同时,pandas也提供了很多时间序列处理的功能,可以方便地对时间序列数据进行处理和分析。因此,pandas数据分析中是一个非常重要的工具。 ### 回答2: Pandas数据分析领域中常用的Python库之一,由于其强大的数据处理和分析能力,已经成为数据科学家的必备之选。 其中,Pandas高效化运算和时间序列处理是两个非常重要的功能,本文将就这两个方面进行详细介绍。 一、Pandas高效化运算 Pandas高效化运算主要涉及两个重要类对象:Series和DataFrame。 (1)Series高效化运算 Series是指一维带标签的数组,通常用于表示时间序列数据。在Pandas中,Series对象支持矢量化运算,因此可以实现高效的运算。 具体而言,Series支持诸如加、减、乘、除等数学运算,以及比较运算(例如大于、小于、等于等)。此外,Series还支持apply方法,它可以接受一个函数作为参数,并应用于Series的每个元素上。 (2)DataFrame高效化运算 DataFrame是指二维带标签的数据结构,通常用于表示表格型数据。在Pandas中,DataFrame也支持矢量化运算。可以对每一列进行加、减、乘、除等运算。 此外,DataFrame还支持apply方法,通过对DataFrame中的每个元素应用一个函数,能够实现更加复杂的运算。 二、Pandas时间序列处理 除了高效化运算,Pandas还具有很强的时间序列分析功能。特别是对于金融数据等时间序列数据,Pandas提供了丰富的扩展和支持。 (1)时间序列数据结构 Pandas中表示时间序列的数据结构主要有两个,分别是Timestamp和DatetimeIndex。Timestamp表示单个时间点,而DatetimeIndex则是多个时间点的集合。 (2)时间序列数据的创建和处理Pandas中,可以通过多种方式来创建时间序列数据,如使用date_range等,还可以使用resample方法进行重采样等处理。 (3)时间序列数据的可视化 Pandas还提供了强大的绘图功能,能够帮助用户更加直观地理解时间序列数据的变化趋势。通过使用plot方法,可以实现各种图形的绘制,如折线图、柱状图、散点图等。 总之,Pandas的高效化运算和时间序列处理功能为数据科学家带来了巨大的便利性,使得他们能够更加快速、精准地从数据中提取信息。 ### 回答3: Pandas是一个强大的Python数据分析库,它具有高效的运算和时间序列处理能力。这使得Pandas成为数据科学家和分析师的首选工具之一。 Pandas高效化运算主要体现在以下三个方面: 1. 向量化运算 Pandas中的向量化运算可以让我们像对待单个数值一样处理整个Series或DataFrame,这比使用Python内置函数循环计算要快很多。此外,Pandas处理向量化运算时,还会使用Cython等高性能库进行加速。 2. apply函数 apply函数是Pandas中非常重要的一个函数,它可以让我们对Series或DataFrame中的元素进行自定义的处理。使用apply函数,我们可以将自己编写的函数应用于Pandas的所有元素,极大的发挥了Pandas的灵活性和高效性。 3. 分组运算 在数据分析过程中,常常需要对数据进行分组运算,然后进行聚合操作。Pandas中的分组运算可以非常高效地处理大量数据,例如对数据分组统计、分组计算均值、中位数、方差等等。 除了高效的运算能力,Pandas还具有强大的时间序列处理能力。在时间序列数据分析过程中,时间索引可谓至关重要,Pandas中的时间序列工具极大地方便了我们的时间序列处理。 1. 时间序列索引 Pandas中的DataFrame和Series都支持时间序列索引,可以很方便地对时间序列数据进行切片、索引、过滤和重取样等操作。 2. 时间数据重取样 时间数据的采样频率对于数据分析非常重要。Pandas提供了resample方法可以对时间序列数据进行重新采样。例如,我们可以将以天为单位的数据重新采样为以周为单位的数据。 3. 移动窗口函数 移动窗口函数可以计算时间序列数据在移动窗口上的各种统计量,如移动平均、移动标准差等。Pandas提供了rolling函数可以很方便地实现这些操作。 总之,Pandas高效的运算能力和强大的时间序列处理能力使得它成为数据分析工作中必不可少的工具之一,同时也方便数据分析者快速处理和分析大量的数据,并有效地发掘数据中的价值。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值