Python是通过操纵实现的吗?

Python是通过操纵实现的吗?,python,python-2.7,pandas,Python,Python 2.7,Pandas,df的外观示例: customer order_datetime a 01-03-2017 12:00:00 PM b 01-04-2017 12:00:00 PM c 01-07-2017 12:00:00 PM a 01-08-2017 12:00:00 PM b 01-09-2017 12:00:00 PM a 01-11-2017 12:00:00 PM 有两件事我想实现,但

df的外观示例:

customer   order_datetime
a          01-03-2017 12:00:00 PM
b          01-04-2017 12:00:00 PM
c          01-07-2017 12:00:00 PM
a          01-08-2017 12:00:00 PM
b          01-09-2017 12:00:00 PM
a          01-11-2017 12:00:00 PM
有两件事我想实现,但我仍在学习过程中,非常感谢任何帮助,以指导我在正确的方向

  • 创建一个“订单间隔时间”列表,我可以在其中找到最小值、平均值和最大值
  • 了解“订单之间的时间”是否变快/变慢,即订单3和订单2之间的时间与订单2和订单1之间的时间

此示例应为您的任务确定正确的方向

首先,我创建了一个与问题中显示的数据帧类似的数据帧:

import pandas as pd
import numpy as np
import datetime as dt

orders = pd.DataFrame({
    'client': np.random.randint(65, 70, size=15),
    'date': np.random.randint(0, 30, size=15)})

orders.client = orders.client.apply(chr)
orders.date = orders.date.apply(
    pd.to_datetime, unit='d', origin=dt.date(2017, 1, 1), box=False)
# Sorting here is not necessary, just for visualization
orders.sort_values(['client', 'date'], inplace=True)
orders.reset_index(inplace=True, drop=True)
orders.head()

>>>>
  client       date
0      A 2017-01-27
1      A 2017-01-29
2      A 2017-01-30
3      B 2017-01-03
4      B 2017-01-13
解决方案的关键在于行
orders.groupby('client').date.apply(pd.Series.sort\u values).diff()

首先,我们使用
client
作为键对订单进行分组,然后我们仅选择
date
列,并使用对每个组中的日期进行排序,最后我们使用计算每个记录与以下记录的差异(这就是为什么必须对每个组中的日期进行排序)

代码的其余部分只是为了可视化结果,即重命名获得的序列并将其与初始数据帧连接

diff_df = pd.concat([
    orders, 
    orders.groupby('client').date.diff().rename('diff')], axis=1)
diff_df.head(10)

>>>>
  client       date    diff
0      A 2017-01-27     NaT
1      A 2017-01-29  2 days
2      A 2017-01-30  1 days
3      B 2017-01-03     NaT
4      B 2017-01-13 10 days
5      B 2017-01-18  5 days
6      B 2017-01-24  6 days
7      C 2017-01-01     NaT
8      C 2017-01-02  1 days
9      C 2017-01-03  1 days
一旦你有了时间差,你就可以计算出你所需要的各种组内指标

首先,您可以尝试:

如果这还不够,你可以自己定义

如果使用单个系列,则需要函数列表:

metrics = [pd.Series.count, pd.Series.min, pd.Series.max, pd.Series.mean]
diff_df.groupby('client').diff.aggregate(metrics)

>>>>
        count  nunique     min     max    mean
client                                        
A           1        1  5 days  5 days  5 days
B           1        1 12 days 12 days 12 days
C           3        2  2 days  5 days  4 days
D           1        1  4 days  4 days  4 days
E           4        4  2 days  9 days  5 days
或者是
{column->function,column->function\u list}
的字典,如果您处理整个数据帧:

metrics = {
    'date': [pd.Series.count, pd.Series.nunique],
    'diff': [pd.Series.min, pd.Series.max, pd.Series.mean],
}
diff_df.groupby('client').aggregate(metrics)

>>>>
          diff                  date        
           min     max    mean count nunique
client                                      
A       5 days  5 days  5 days     2       2
B      12 days 12 days 12 days     2       2
C       2 days  5 days  4 days     4       4
D       4 days  4 days  4 days     2       2
E       2 days  9 days  5 days     5       5

这感觉像是一项任务。请认真尝试并返回代码中的问题。
metrics = {
    'date': [pd.Series.count, pd.Series.nunique],
    'diff': [pd.Series.min, pd.Series.max, pd.Series.mean],
}
diff_df.groupby('client').aggregate(metrics)

>>>>
          diff                  date        
           min     max    mean count nunique
client                                      
A       5 days  5 days  5 days     2       2
B      12 days 12 days 12 days     2       2
C       2 days  5 days  4 days     4       4
D       4 days  4 days  4 days     2       2
E       2 days  9 days  5 days     5       5