【发布时间】:2015-02-11 05:27:34
【问题描述】:
我有这个测试数据集,它显示了每个客户端、service_id 和时间段的服务状态(“in_progress”或“stopped”)。我编写了代码,以便您可以复制和粘贴以生成 DataFrame。让我们看看(暂时忽略左箭头):
In [1]: import pandas as pd
In [2]: my_data = \
[{'client_id' : '01', 'service_id': '01', 'status_start' : '2014-01-01', 'status_end' : '2014-02-13', 'service_status' : 'in_progress'},
{'client_id' : '01', 'service_id': '02', 'status_start' : '2014-01-01', 'status_end' : '2014-02-18', 'service_status' : 'stopped'},
{'client_id' : '01', 'service_id': '12', 'status_start' : '2014-02-14', 'status_end' : '2014-04-13', 'service_status' : 'in_progress'},
{'client_id' : '02', 'service_id': '56', 'status_start' : '2014-03-01', 'status_end' : '2014-04-13', 'service_status' : 'in_progress'},
{'client_id' : '02', 'service_id': '58', 'status_start' : '2014-02-04', 'status_end' : '2014-04-13', 'service_status' : 'stopped'},
{'client_id' : '02', 'service_id': '60', 'status_start' : '2014-02-08', 'status_end' : '2014-04-23', 'service_status' : 'stopped'},
{'client_id' : '03', 'service_id': '61', 'status_start' : '2014-02-10', 'status_end' : '2014-04-28', 'service_status' : 'in_progress'},
{'client_id' : '03', 'service_id': '63', 'status_start' : '2014-02-01', 'status_end' : '2014-04-28', 'service_status' : 'in_progress'},
{'client_id' : '03', 'service_id': '65', 'status_start' : '2014-01-10', 'status_end' : '2014-03-28', 'service_status' : 'in_progress'}
]
In [3]: df = pd.DataFrame(my_data)
In [4]: df
client_id service_id status_start status_end service_status
--> 0 01 01 2014-01-01 2014-02-13 in_progress
--> 1 01 02 2014-01-01 2014-02-18 stopped
--> 2 01 12 2014-02-14 2014-04-13 in_progress
3 02 56 2014-03-01 2014-04-13 in_progress
4 02 58 2014-02-04 2014-04-13 stopped
5 02 60 2014-02-08 2014-04-23 stopped
6 03 61 2014-02-10 2014-04-28 in_progress
7 03 63 2014-02-01 2014-04-28 in_progress
--> 8 03 65 2014-01-10 2014-03-28 in_progress
我想问数据的问题是:每个 service_status 中每个月和客户有多少服务?
也就是说,例如,客户端 '01' 一月份有 1 个服务 'in_progress' 和 1 个 'stopped'。同一个客户端“01”在 2 月份有 2 个“in_progress”(一个在 1 月份已经存在,一个在 2 月份有一个新的)和 1 个新的标记为“停止”。但在 3 月和 4 月,只有一项服务“in_progress”(services_ids '01' 和 '02' 在 2 月终止)。遵循相同的规则,客户端“03”在 1 月份有 1 个服务“in_progress”和 0 个“停止”。
所以最终的 DataFrame 看起来像这样(现在您会看到箭头突出显示刚刚注释的示例的行):
In [5]: summary_df
client_id month status_in_progress status_stopped
--> 0 01 Jan 1 1
--> 1 01 Feb 2 1
--> 2 01 Mar 1 0
--> 3 01 Apr 1 0
4 02 Jan 0 0
5 02 Feb 0 2
6 02 Mar 1 2
7 02 Apr 1 2
--> 8 03 Jan 1 0
9 03 Feb 3 0
10 03 Mar 3 0
11 03 Apr 2 0
我尝试使用groupby 和pivot_table,但没有成功。好吧,我必须说实话:我使用了一个 for 循环,需要 6 个小时才能完成(原始数据集有超过 500 万行)。
有人可以帮忙吗? pandas/python 新手,请耐心等待! :)
谢谢!
【问题讨论】:
-
这是一个有趣的问题。 非常感谢“我编写了代码,以便您可以复制和粘贴以生成 DataFrame。”:D
-
我在寻求帮助,所以这是我能做的至少 :)