熊猫分组的天数,子集和另一列上的组合的差异

时间:2019-07-15 09:29:40

标签: pandas pandas-groupby

我有如下所示的移动维修数据。

根据ID和日期排序。

ID  Status  Date    Cost
0   1   F   2017-06-22  500
1   1   M   2017-07-22  100
7   1   F   2018-06-22  600
9   1   M   2018-08-22  150
10  1   F   2019-03-22  750
2   2   M   2017-06-29  200
5   2   F   2017-09-29  600
6   2   F   2018-01-29  500
16  2   M   2018-03-29  100
17  2   M   2018-04-29  100
18  2   F   2018-12-29  500
3   3   M   2017-03-20  300
8   3   F   2018-06-20  700
11  3   M   2018-10-20  250
4   4   M   2017-08-10  800
12  4   F   2018-06-10  100
13  4   F   2018-10-10  500
14  4   M   2019-01-10  200
15  4   F   2019-06-10  600

F-失败

M-维护

Q1)我的目的是找出M(维护)对增加F(故障)持续时间的影响。

即。故障时间如何随着它们之间的维护而变化。

df['D'] = df.groupby('ID')['Date'].diff().dt.days

首先,我尝试使用连续的F-F模式将上述数据帧子集化,如下所示

F-F模式(连续F-F-ID明智)

ID  Status  Date    Cost
5   2   F   2017-09-29  600
6   2   F   2018-01-29  500
12  4   F   2018-06-10  100
13  4   F   2018-10-10  500

请帮助我获得熊猫代码,以获取以上子集。

同样,我想对M-F,F-M和M-M模式进行子集化并分析持续时间。为了解决这个问题,请提出您的想法,而不是子集化。

期望的F-M子集

ID  Status  Date    Cost
0   1   F   2017-06-22  500
1   1   M   2017-07-22  100
7   1   F   2018-06-22  600
9   1   M   2018-08-22  150
6   2   F   2018-01-29  500
16  2   M   2018-03-29  100
8   3   F   2018-06-20  700
11  3   M   2018-10-20  250
13  4   F   2018-10-10  500
14  4   M   2019-01-10  200

1 个答案:

答案 0 :(得分:1)

使用:

#convert to datetimes and sorting
df['Date'] = pd.to_datetime(df['Date'])
df = df.sort_values(['ID', 'Date', 'Status'])

#differenc column
df['D'] = df.groupby('ID')['Date'].diff().dt.days
#create statust column with next and previous values per groups
df['S1'] = df.groupby('ID')['Status'].shift() + '-'+ df['Status']
df['S2'] = df['Status']  + '-'+ df.groupby('ID')['Status'].shift(-1)

#filter by boolean indexing
pat = 'F-F'
df1 = df[df['S1'].eq(pat) | df['S2'].eq(pat)]
print (df1)
    ID Status       Date  Cost      D   S1   S2
5    2      F 2017-09-29   600   92.0  M-F  F-F
6    2      F 2018-01-29   500  122.0  F-F  M-F
12   4      F 2018-06-10   100  304.0  M-F  F-F
13   4      F 2018-10-10   500  122.0  F-F  M-F

pat = 'F-M'   
df1 = df[(df['S1'].eq(pat) | df['S2'].eq(pat))]
print (df1)
    ID Status       Date  Cost      D   S1   S2
0    1      F 2017-06-22   500    NaN  NaN  F-M
1    1      M 2017-07-22   100   30.0  F-M  M-F
7    1      F 2018-06-22   600  335.0  M-F  F-M
9    1      M 2018-08-22   150   61.0  F-M  M-F
6    2      F 2018-01-29   500  122.0  F-F  F-M
16   2      M 2018-03-29   100   59.0  F-M  M-M
8    3      F 2018-06-20   700  457.0  M-F  F-M
11   3      M 2018-10-20   250  122.0  F-M  NaN
13   4      F 2018-10-10   500  122.0  F-F  F-M
14   4      M 2019-01-10   200   92.0  F-M  M-F