如何在对pandas groupby数据框进行循环处理的同时对条件进行向量化

时间:2018-08-02 09:30:40

标签: python pandas conditional vectorization

我正在尝试根据某些列的内容将某些数据分组。我拥有的当前代码取决于循环,我想进行向量化以提高性能。我知道这是大熊猫的前进之路,尽管我可以将一些问题向量化,但我确实为这一问题而苦苦挣扎。

我需要做的是按ClientNumber分组数据,并链接真实的和不完整的行,以便对于每个Clientnumber,所有真实的行都具有不同的进程ID,并且给不完整的行赋予与最接近的真实行相同的进程ID。 StartDate大于未完成行的StartDate的行(实质上,未完成行应连接到正版行(如果存在),一旦找到正版行,则应关闭该分组并将以后的行视为单独的事件)。然后,我必须能够为每行设置一个进程开始日期,该日期等于该组processID中最低的开始日期,并在单独的列中将ProcessCount标记为最后一行(StartDate最大的那一行)。

抱歉,我在这里缺乏描述能力,希望到目前为止我拥有的代码(用Python 3.6编写)可以更好地解释我想要的结果。该代码有效,但是如您所见,它依赖于我不喜欢的嵌套循环。我已经尝试研究一下如何找出向量化方法,但是我一直在努力解决这个问题的概念。

我们将不胜感激任何可以帮助我弄清楚这段代码中的循环的内容,并且确实可以帮助我更好地了解如何将此应用到以后的其他任务中。

数据

df_dict = {'ClientNumber': {0: 1234, 1: 1234, 2: 1234, 3: 123, 4: 123, 5: 123, 6: 12, 7: 12, 8: 1}, 'Genuine_Incomplete': {0: 'Incomplete', 1: 'Genuine', 2: 'Genuine', 3: 'Incomplete', 4: 'Incomplete', 5: 'Genuine', 6: 'Incomplete', 7: 'Incomplete', 8: 'Genuine'}, 'StartDate': {0: Timestamp('2018-01-01 00:00:00'), 1: Timestamp('2018-01-05 00:00:00'), 2: Timestamp('2018-03-01 00:00:00'), 3: Timestamp('2018-01-01 00:00:00'), 4: Timestamp('2018-01-03 00:00:00'), 5: Timestamp('2018-01-10 00:00:00'), 6: Timestamp('2018-01-01 00:00:00'), 7: Timestamp('2018-06-02 00:00:00'), 8: Timestamp('2018-01-01 00:00:00')}}



df = pd.DataFrame(data=df_dict)

df["ID"] = df.index
df["Process_Start_Date"] = np.nan
df["ProcessCode"] = np.nan
df["ProcessCount"] = np.nan


grouped_df = df.groupby('ClientNumber')
for key, item in grouped_df:
    newdf = grouped_df.get_group(key)
    newdf.sort_values(by=["StartDate"], inplace=True)
    c = 1
    for i in newdf.iterrows():
        i = i[0]
        GI = df.loc[i, "Genuine_Incomplete"]
        proc_code = "{}_{}".format(df.loc[i, "ClientNumber"],c)
        df.loc[i, "ProcessCode"] = proc_code
        if GI == "Genuine":
            c += 1

grouped_df = df.groupby('ProcessCode')
for key, item in grouped_df:
    newdf = grouped_df.get_group(key)
    newdf.sort_values(by=["StartDate"], inplace=True)
    df.loc[newdf.ID.iat[-1], "ProcessCount"] = 1
    for i in newdf.iterrows():
        i = i[0]
        df.loc[i, "Process_Start_Date"] = df.loc[newdf.ID.iat[0], "StartDate"]
  • 注意-您可能已经注意到我使用了df [“ ID”],它只是索引的副本。我知道这不是一个好习惯,但是我无法弄清楚如何使用索引从其他列中设置值。对此的任何建议也非常受欢迎。

0 个答案:

没有答案