Python是通过操纵实现的吗?
df的外观示例: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 有两件事我想实现,但
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