如何在应用条件时通过groupby数据帧矢量化循环

2024-06-16 13:07:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图根据某些栏目的内容将一些数据组织成若干组。我现在的代码依赖于循环,我想用矢量化来提高性能。我知道这是熊猫的前进之路,虽然我可以引导一些问题,但我真的在努力解决这个问题。你知道吗

我需要做的是按ClientNumber对数据进行分组,并链接真正的行和不完整的行,这样对于每个ClientNumber,所有真正的行都有一个不同的进程ID,而不完整的行被赋予与最近的真正行相同的进程ID,后者的StartDate大于不完整行的StartDate(本质上,不完整的行应该连接到一个真正的行(如果存在的话),一旦找到一个真正的行,它应该关闭该分组,并将未来的行作为单独的事件处理)。然后,我必须能够为每一行设置一个进程开始日期,该日期等于processID组中的最低开始日期,并在单独的列中用ProcessCount标记最后一行(StartDate最大的一行)。你知道吗

很抱歉我在这里缺乏描述能力,希望到目前为止我的代码(用python3.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”]只是索引的一个副本。我知道这不是一个好的做法,但我无法解决如何使用索引设置其他列的值。任何这样做的建议也是非常欢迎的。你知道吗

Tags: key代码iniddffor进程loc