根据“状态”列和“日期”列中的“模式”子集,以“ ID”列为子集对数据框进行分组

时间:2019-07-01 12:05:28

标签: pandas

我有一个如下所示的数据框,我试图根据ID的“状态”列和“日期”列的模式过滤数据。

我的代码:

import pandas as pd
import numpy as np
sales = [{'ID': '1', 'Status': 'F', 'Date': '2017-04-26'},
         {'ID': '2', 'Status': 'F', 'Date': '2017-05-06'},
         {'ID': '1', 'Status': 'M', 'Date': '2017-05-16'},
        {'ID': '1', 'Status': 'F', 'Date': '2017-07-06'},
         {'ID': '2', 'Status': 'F', 'Date': '2017-09-06'},
         {'ID': '1', 'Status': 'F', 'Date': '2018-01-14'},
         {'ID': '3', 'Status': 'M', 'Date': '2017-07-16'},
         {'ID': '4', 'Status': 'F', 'Date': '2017-07-16'},
         {'ID': '2', 'Status': 'M', 'Date': '2018-07-06'},
         {'ID': '3', 'Status': 'F', 'Date': '2018-01-06'},
         {'ID': '3', 'Status': 'M', 'Date': '2018-07-06'},
         {'ID': '3', 'Status': 'F', 'Date': '2019-07-06'},
        {'ID': '2', 'Status': 'M', 'Date': '2019-05-06'},
        {'ID': '2', 'Status': 'F', 'Date': '2019-10-06'},
        {'ID': '4', 'Status': 'M', 'Date': '2019-11-06'}]
df = pd.DataFrame(sales)
df['Date'] = pd.to_datetime(df['Date'])
df = df.sort_values(['ID', 'Date', 'Status'])

我尝试了以下代码。

df_status = df.groupby('ID')['Status'].apply(list)
dict_st= df_status.to_frame().to_dict().get('Status')

根据ID对DF排序后,在数据框上注明日期

      Date      ID Status
0   2017-04-26  1   F
2   2017-05-16  1   M
3   2017-07-06  1   F
5   2018-01-14  1   F
1   2017-05-06  2   F
4   2017-09-06  2   F
8   2018-07-06  2   M
12  2019-05-06  2   M
13  2019-10-06  2   F
6   2017-07-16  3   M
9   2018-01-06  3   F
10  2018-07-06  3   M
11  2019-07-06  3   F
7   2017-07-16  4   F
14  2019-11-06  4   M

我的预期输出是带有F-F,F-M的2个表,如下所示。
设置子集后,我期望以下两个数据帧。

说明: 排序后,按ID明智的状态顺序将为

ID
1       [F, M, F, F]
2    [F, F, M, M, F]
3       [M, F, M, F]
4             [F, M]

第一次过滤/父数据帧子集后的F-F数据帧

      Date     ID Status
0   2017-07-06  1   F
1   2018-01-14  1   F
2   2017-05-06  2   F
3   2017-09-06  2   F

第二次过滤后的F-M数据帧

      Date     ID Status
0   2017-04-26  1   F
1   2017-05-16  1   M
2   2017-09-06  2   F
3   2018-07-06  2   M
4   2018-01-06  3   F
5   2018-07-06  3   M
6   2017-07-16  4   F
7   2019-11-06  4   M

我尝试了以下代码

df_status = df.groupby('ID')['Status'].apply(list)
dict_st= df_status.to_frame().to_dict().get('Status')

df_status如下所示

    ID
    1       [F, M, F, F]
    2    [F, F, M, M, F]
    3       [M, F, M, F]
    4             [F, M]

那之后我被困住了。我不知道要继续。

0 个答案:

没有答案