Python数据框按日期滚动并拼接一个字符串

编程语言 2026-07-08

python dataframe rolling by date to get sum and concatinate a string 中,Furas展示了如何在滚动分组中连接一个字符串——交易ID。然而,这并没有解决问题。我需要带有它们所属分组的交易ID。

在下面的代码中:

    print("\n---  the groups ---\n")
    print( all_windows._grouper.groups )

返回的是:

print( all_windows._grouper.groups )
{(11608, '[email protected]', 116, 'Duffy's Lumber'): [2026-03-03 00:00:00],
 (11608, '[email protected]', 116, 'Lowes'): [2026-02-09 00:00:00], 
 (11608, '[email protected]', 116, 'WB Mason'): [2026-01-03 00:00:00], 
 (11608, '[email protected]', 116, 'corner store'): [2025-12-03 00:00:00, 2025-12-20 00:00:00, 2025-12-20 00:00:00], 
 (11608, '[email protected]', 116, 'nino's pizza'): [2026-01-25 00:00:00, 2026-02-02 00:00:00], 
 (11608, '[email protected]', 608, 'Lowes'): [2026-01-29 00:00:00, 2026-02-05 00:00:00, 2026-02-15 00:00:00], 
 (11608, '[email protected]', 608, 'Staples'): [2026-01-05 00:00:00, 2026-01-06 00:00:00, 2026-01-06 00:00:00], 
 (11608, '[email protected]', 608, 'corner store'): [2025-12-10 00:00:00, 2025-12-31 00:00:00], 
 (11608, '[email protected]', 608, 'nino's pizza'): [2026-02-11 00:00:00], 
 (52846, '[email protected]', 456, 'Lowes'): [2025-12-10 00:00:00, 2025-12-31 00:00:00, 2026-01-06 00:00:00], 
 (52846, '[email protected]', 456, 'local hardware'): [2026-01-27 00:00:00, 2026-01-29 00:00:00], 
 (52846, '[email protected]', 456, 'nino's pizza'): [2026-02-11 00:00:00, 2026-03-03 00:00:00, 2026-04-10 00:00:00], 
 (52846, '[email protected]', 846, 'HARBOR FREIGHT'): [2025-12-02 00:00:00], 
 (52846, '[email protected]', 846, 'corner store'): [2026-02-02 00:00:00, 2026-02-05 00:00:00], 
 (52846, '[email protected]', 846, 'nino's pizza'): [2025-12-20 00:00:00, 2026-01-01 00:00:00], 
 (52846, '[email protected]', 846, 'pepe's pizza'): [2026-02-09 00:00:00], 
 (77400, '[email protected]', 400, 'Duffy's Lumber'): [2025-12-10 00:00:00, 2026-04-10 00:00:00, 2026-04-15 00:00:00], 
 (77400, '[email protected]', 400, 'HARBOR FREIGHT'): [2026-01-06 00:00:00, 2026-01-27 00:00:00, 2026-02-09 00:00:00], 
 (77400, '[email protected]', 400, 'WB Mason'): [2026-02-05 00:00:00], 
 (77400, '[email protected]', 707, 'Duffy's Lumber'): [2025-12-02 00:00:00, 2025-12-23 00:00:00, 2025-12-31 00:00:00, 2026-01-03 00:00:00], 
 (77400, '[email protected]', 707, 'HARBOR FREIGHT'): [2026-01-29 00:00:00], 
(77400, '[email protected]', 707, 'WB Mason'): [2026-02-02 00:00:00, 2026-02-11 00:00:00]}

这些是在交易日期在10天内的分组。现在我需要相应的交易ID。

有没有办法对all_windows使用 "loc" 来获取交易ID?

我找不到实现的方法。

# -*- coding: utf-8 -*-
"""
Created on Fri Jun  5 11:29:36 2026

@author: ne098406
"""

# Source - https://stackoverflow.com/a/79951973
# Posted by furas, modified by community. See post 'Timeline' for change history
# Retrieved 2026-06-08, License - CC BY-SA 4.0

import io
import os
import pandas as pd

DATA = """
TRANSACTION DATE,EMPLOYEE ID,ACCOUNT EMAIL ADDRESS,ACCOUNT NUMBER,MERCHANT NAME,EXPENSE DESCRIPTION,TRANSACTION ID,TRANSACTION AMOUNT
2025-12-02,52846,[email protected],846,HARBOR FREIGHT,electrician tool,5454344019001,131.18
2025-12-10,52846,[email protected],456,Lowes,Pipe Insulation and fitting,5459405088001,34.79
2025-12-20,52846,[email protected],846,nino's pizza,lunch,5459405089001,98.98
2025-12-31,52846,[email protected],456,Lowes,nuts and bolts for maintenance,5471834423001,56.47
2026-01-01,52846,[email protected],846,nino's pizza,lunch,5471834424001,139
2026-01-06,52846,[email protected],456,Lowes,Cable Cutter Pliers,5347075493001,83.98
2026-01-27,52846,[email protected],456,local hardware,paint,5347075494001,242.37
2026-01-29,52846,[email protected],456,local hardware,Pipe Insulation and fitting,5357832073001,15.62
2026-02-02,52846,[email protected],846,corner store,OFFICE CLOCK,5361456559001,29.44
2026-02-05,52846,[email protected],846,corner store,office supplies,5386878553001,716.2
2026-02-09,52846,[email protected],846,pepe's pizza,lunch,5401420274001,642.2
2026-02-11,52846,[email protected],456,nino's pizza,lunch,5403179700001,29.15
2026-03-03,52846,[email protected],456,nino's pizza,lunch,5414434974001,105.9
2026-04-10,52846,[email protected],456,nino's pizza,lunch,5414434975001,191.27
2025-12-02,77400,[email protected],707,Duffy's Lumber,Nails,5350647122001,154.7
2025-12-10,77400,[email protected],400,Duffy's Lumber,screws,5353050810001,316.62
2025-12-23,77400,[email protected],707,Duffy's Lumber,Fittings for compressor,5356156974001,170.02
2025-12-31,77400,[email protected],707,Duffy's Lumber,fuses,5359620179001,62.84
2026-01-03,77400,[email protected],707,Duffy's Lumber,Nails,5372912596001,366.8
2026-01-06,77400,[email protected],400,HARBOR FREIGHT,bolts,5390241877001,748
2026-01-27,77400,[email protected],400,HARBOR FREIGHT,Cable Cutter Pliers,5401420255001,200
2026-01-29,77400,[email protected],707,HARBOR FREIGHT,bolts,5409512783001,47.49
2026-02-02,77400,[email protected],707,WB Mason,whiteboard calendar & desk calendar,5423349484001,34.91
2026-02-05,77400,[email protected],400,WB Mason,OFFICE CHAIR,5425031381001,48.99
2026-02-09,77400,[email protected],400,HARBOR FREIGHT,electrician tool,5425031382001,152.9
2026-02-11,77400,[email protected],707,WB Mason,mouse pad,5451761817001,34.03
2026-04-10,77400,[email protected],400,Duffy's Lumber,sump pump,5451761818001,25.73
2026-04-15,77400,[email protected],400,Duffy's Lumber,Insulation pipe and wrap,5473621360001,189.99
2025-12-03,11608,[email protected],116,corner store,spare keys,5403179702001,14.25
2025-12-10,11608,[email protected],608,corner store,coffee donuts,5403179703001,256.9
2025-12-20,11608,[email protected],116,corner store,coffee and donuts for all hands meeting,5403179704001,45.98
2025-12-20,11608,[email protected],116,corner store,Bottled Water,5403179705001,139.98
2025-12-31,11608,[email protected],608,corner store,Batteries,5405062431001,24.12
2026-01-03,11608,[email protected],116,WB Mason,envelopes,5406965833001,67.9
2026-01-05,11608,[email protected],608,Staples,whiteboard calendar & desk calendar,5406965834001,73.93
2026-01-06,11608,[email protected],608,Staples,office supplies,5412746497001,327
2026-01-06,11608,[email protected],608,Staples,office supplies,5416288516001,92.98
2026-01-25,11608,[email protected],116,nino's pizza,lunch for crew,5416288517001,43.75
2026-01-29,11608,[email protected],608,Lowes,electrician tool,5416288518001,54.99
2026-02-02,11608,[email protected],116,nino's pizza,meatball hero,5416288519001,39.4
2026-02-05,11608,[email protected],608,Lowes,nuts and bolts for maintenance,5416288520001,68.03
2026-02-09,11608,[email protected],116,Lowes,Cable Cutter Pliers,5416288521001,75.04
2026-02-11,11608,[email protected],608,nino's pizza,large pie,5416288522001,41.96
2026-03-03,11608,[email protected],116,Duffy's Lumber,tape measure,5416288523001,142.52
2026-02-15,11608,[email protected],608,Lowes,3/4 plywood,5416288524001,59.99
"""

DATE_COL = "TRANSACTION DATE"
DATE_FORMAT = "%Y-%m-%d"
GROUP_COLS = [
    "EMPLOYEE ID",
    "ACCOUNT EMAIL ADDRESS",
    "ACCOUNT NUMBER",
    "MERCHANT NAME",
]

df = pd.read_csv(io.StringIO(DATA), parse_dates=[DATE_COL], date_format=DATE_FORMAT)
df["TRANSACTION DATE"] = pd.to_datetime(df["TRANSACTION DATE"])
df.set_index("TRANSACTION DATE", inplace=True)
df.sort_index()
df["ACCOUNT NUMBER"] = df["ACCOUNT NUMBER"].astype("Int64")
df["TRANSACTION ID STR"] = df["TRANSACTION ID"].astype("string")

##  ## df = df.sort_values(GROUP_COLS + [DATE_COL])

print("--- df ---")
print(df)

rollingSum = (
    df.groupby(
        ["EMPLOYEE ID", "ACCOUNT EMAIL ADDRESS", "ACCOUNT NUMBER", "MERCHANT NAME"]
    )
    .rolling(window="11D")["TRANSACTION AMOUNT"]
    .sum()
)

rollingCnt = (
    df.groupby(
        ["EMPLOYEE ID", "ACCOUNT EMAIL ADDRESS", "ACCOUNT NUMBER", "MERCHANT NAME"]
    )
    .rolling(window="11D")["TRANSACTION ID"]
    .count()
)


def version_0(df):
    print("\n--- original version - doesn't work ---\n")

    try:
        rollingTransId = (
            df.groupby(
                [
                    "EMPLOYEE ID",
                    "ACCOUNT EMAIL ADDRESS",
                    "ACCOUNT NUMBER",
                    "MERCHANT NAME",
                ]
            )
            .rolling(window="11D")["TRANSACTION ID STR"]
            .apply(lambda x: ",".join(x.dropna().astype(str)))
        )

        print("--- rollingTransId ---")
        print(rollingTransId)
    except Exception as ex:
        print("Ex:", ex)


def version_1_a(df):
    print("\n--- for-loop ---\n")

    all_windows = df.groupby(
        ["EMPLOYEE ID", "ACCOUNT EMAIL ADDRESS", "ACCOUNT NUMBER", "MERCHANT NAME"]
    ).rolling(window="11D")["TRANSACTION ID STR"]

    print("\n---  the groups ---\n")
    print( all_windows._grouper.groups )

    rollingTransId = []

    for window in all_windows:
        text = ",".join(window.dropna().astype(str))
        rollingTransId.append(text)

    print("--- rollingTransId ---")
    print(rollingTransId)


def version_1_b(df):
    print("\n---  list comprehension ---\n")

    all_windows = df.groupby(
        ["EMPLOYEE ID", "ACCOUNT EMAIL ADDRESS", "ACCOUNT NUMBER", "MERCHANT NAME"]
    ).rolling(window="11D")["TRANSACTION ID STR"]

    print("\n---  the groups ---\n")
    print( all_windows._grouper.groups )

    rollingTransId = [
        ",".join(window.dropna().astype(str)) for window in all_windows
    ]

    print("--- rollingTransId ---")
    print(rollingTransId)


def version_2(df):
    print("\n--- Series ---\n")

    all_windows = df.groupby(
        ["EMPLOYEE ID", "ACCOUNT EMAIL ADDRESS", "ACCOUNT NUMBER", "MERCHANT NAME"]
    ).rolling(window="11D")["TRANSACTION ID STR"]

    print("\n---  the groups ---\n")
    print( all_windows._grouper.groups )

    all_windows = pd.Series(all_windows)

    rollingTransId = all_windows.apply(
        lambda window: ",".join(window.dropna().astype(str))
    )

    # rollingTransId = pd.Series(all_windows).apply(
    #     lambda window: ",".join(window.dropna().astype(str))
    # )

    print("--- rollingTransId ---")
    print(rollingTransId.to_list())


def version_3(df):
    print("\n--- DataFrame ---\n")

    all_windows = df.groupby(
        ["EMPLOYEE ID", "ACCOUNT EMAIL ADDRESS", "ACCOUNT NUMBER", "MERCHANT NAME"]
    ).rolling(window="11D")["TRANSACTION ID STR"]
    # print(f"{type(all_windows)=}")

    print("\n---  the groups ---\n")
    print( all_windows._grouper.groups )

    all_windows = pd.DataFrame(all_windows)

    rollingTransId = all_windows.apply(
        lambda window: ",".join(window.dropna().astype(str))
    )

    print("--- rollingTransId ---")
    print(rollingTransId)


# --- main ---

# version_0(df)  # original   # doesn't work
version_1_a(df)  # for-loop   # OK
version_1_b(df)  # for-loop   # OK
version_2(df)  # Series       # OK
# version_3(df)  # DataFrame  # doesn't work

解决方案

我想我找到了一个更简单的方法。至少对这段代码而言。但它也有一些弊端。

通常 .apply().rolling() 中只能创建 float/integer 的结果——因此它不能运行会创建字符串的函数。但你可以运行一个返回任意 float/integer 值的函数,它还会把字符串放到一个全局列表中,稍后你可以使用全局列表中的带字符串的值来替换列中的 float/integer 值。

它更短、更简单,也更易读。

并且它的输出与前一个问题中的 .sum().count() 相似。

它有一个问题:在把字符串传给函数之前会把它们转换成浮点数,因此需要额外的 astype(int)(用于在没有 .0 的情况下获取字符串),而当存在真正的文本如 "Hello World" 时它将不起作用。

可能在数值从整数/文本转换为浮点数再返回到整数/文本时存在近似的问题。但就这个示例而言,我没有看到这个问题。

def version_global_result(df):

    def join_strings(data):
        global global_list

        text = ",".join(data.dropna().astype(int).astype(str))
        global_list.append(text)

        return 0  # anything (float/integer)

    # ---

    global global_list

    global_list = []  # set empty before every execution

    result = (
        df.groupby(
            ["EMPLOYEE ID", "ACCOUNT EMAIL ADDRESS", "ACCOUNT NUMBER", "MERCHANT NAME"]
        )
        .rolling(window="11D")["TRANSACTION ID STR"]
        .apply(join_strings)
    )

    result = result.astype(str)  # to hide warning about wrong type of data
    result[:] = global_list      # replace values
    print(result)

完整的测试代码:

import io
import os
import pandas as pd

DATA = """
TRANSACTION DATE,EMPLOYEE ID,ACCOUNT EMAIL ADDRESS,ACCOUNT NUMBER,MERCHANT NAME,EXPENSE DESCRIPTION,TRANSACTION ID,TRANSACTION AMOUNT
2025-12-02,52846,[email protected],846,HARBOR FREIGHT,electrician tool,5454344019001,131.18
2025-12-10,52846,[email protected],456,Lowes,Pipe Insulation and fitting,5459405088001,34.79
2025-12-20,52846,[email protected],846,nino's pizza,lunch,5459405089001,98.98
2025-12-31,52846,[email protected],456,Lowes,nuts and bolts for maintenance,5471834423001,56.47
2026-01-01,52846,[email protected],846,nino's pizza,lunch,5471834424001,139
2026-01-06,52846,[email protected],456,Lowes,Cable Cutter Pliers,5347075493001,83.98
2026-01-27,52846,[email protected],456,local hardware,paint,5347075494001,242.37
2026-01-29,52846,[email protected],456,local hardware,Pipe Insulation and fitting,5357832073001,15.62
2026-02-02,52846,[email protected],846,corner store,OFFICE CLOCK,5361456559001,29.44
2026-02-05,52846,[email protected],846,corner store,office supplies,5386878553001,716.2
2026-02-09,52846,[email protected],846,pepe's pizza,lunch,5401420274001,642.2
2026-02-11,52846,[email protected],456,nino's pizza,lunch,5403179700001,29.15
2026-03-03,52846,[email protected],456,nino's pizza,lunch,5414434974001,105.9
2026-04-10,52846,[email protected],456,nino's pizza,lunch,5414434975001,191.27
2025-12-02,77400,[email protected],707,Duffy's Lumber,Nails,5350647122001,154.7
2025-12-10,77400,[email protected],400,Duffy's Lumber,screws,5353050810001,316.62
2025-12-23,77400,[email protected],707,Duffy's Lumber,Fittings for compressor,5356156974001,170.02
2025-12-31,77400,[email protected],707,Duffy's Lumber,fuses,5359620179001,62.84
2026-01-03,77400,[email protected],707,Duffy's Lumber,Nails,5372912596001,366.8
2026-01-06,77400,[email protected],400,HARBOR FREIGHT,bolts,5390241877001,748
2026-01-27,77400,[email protected],400,HARBOR FREIGHT,Cable Cutter Pliers,5401420255001,200
2026-01-29,77400,[email protected],707,HARBOR FREIGHT,bolts,5409512783001,47.49
2026-02-02,77400,[email protected],707,WB Mason,whiteboard calendar & desk calendar,5423349484001,34.91
2026-02-05,77400,[email protected],400,WB Mason,OFFICE CHAIR,5425031381001,48.99
2026-02-09,77400,[email protected],400,HARBOR FREIGHT,electrician tool,5425031382001,152.9
2026-02-11,77400,[email protected],707,WB Mason,mouse pad,5451761817001,34.03
2026-04-10,77400,[email protected],400,Duffy's Lumber,sump pump,5451761818001,25.73
2026-04-15,77400,[email protected],400,Duffy's Lumber,Insulation pipe and wrap,5473621360001,189.99
2025-12-03,11608,[email protected],116,corner store,spare keys,5403179702001,14.25
2025-12-10,11608,[email protected],608,corner store,coffee donuts,5403179703001,256.9
2025-12-20,11608,[email protected],116,corner store,coffee and donuts for all hands meeting,5403179704001,45.98
2025-12-20,11608,[email protected],116,corner store,Bottled Water,5403179705001,139.98
2025-12-31,11608,[email protected],608,corner store,Batteries,5405062431001,24.12
2026-01-03,11608,[email protected],116,WB Mason,envelopes,5406965833001,67.9
2026-01-05,11608,[email protected],608,Staples,whiteboard calendar & desk calendar,5406965834001,73.93
2026-01-06,11608,[email protected],608,Staples,office supplies,5412746497001,327
2026-01-06,11608,[email protected],608,Staples,office supplies,5416288516001,92.98
2026-01-25,11608,[email protected],116,nino's pizza,lunch for crew,5416288517001,43.75
2026-01-29,11608,[email protected],608,Lowes,electrician tool,5416288518001,54.99
2026-02-02,11608,[email protected],116,nino's pizza,meatball hero,5416288519001,39.4
2026-02-05,11608,[email protected],608,Lowes,nuts and bolts for maintenance,5416288520001,68.03
2026-02-09,11608,[email protected],116,Lowes,Cable Cutter Pliers,5416288521001,75.04
2026-02-11,11608,[email protected],608,nino's pizza,large pie,5416288522001,41.96
2026-03-03,11608,[email protected],116,Duffy's Lumber,tape measure,5416288523001,142.52
2026-02-15,11608,[email protected],608,Lowes,3/4 plywood,5416288524001,59.99
"""

DATE_COL = "TRANSACTION DATE"
DATE_FORMAT = "%Y-%m-%d"
GROUP_COLS = [
    "EMPLOYEE ID",
    "ACCOUNT EMAIL ADDRESS",
    "ACCOUNT NUMBER",
    "MERCHANT NAME",
]

df = pd.read_csv(io.StringIO(DATA), parse_dates=[DATE_COL], date_format=DATE_FORMAT)
df["TRANSACTION DATE"] = pd.to_datetime(df["TRANSACTION DATE"])
df.set_index("TRANSACTION DATE", inplace=True)
df.sort_index()
df["ACCOUNT NUMBER"] = df["ACCOUNT NUMBER"].astype("Int64")
df["TRANSACTION ID STR"] = df["TRANSACTION ID"].astype("string")

# print("--- df ---")
# print(df)


def version_global_result(df):

    def join_strings(data):
        global global_list

        text = ",".join(data.dropna().astype(int).astype(str))
        global_list.append(text)

        return 0  # anything (float/integer)

    # ---

    global global_list

    global_list = []  # set empty before every execution

    result = (
        df.groupby(
            ["EMPLOYEE ID", "ACCOUNT EMAIL ADDRESS", "ACCOUNT NUMBER", "MERCHANT NAME"]
        )
        .rolling(window="11D")["TRANSACTION ID STR"]
        .apply(join_strings)
    )

    # print(result)
    # print(global_list)

    result = result.astype(str)  # to hide warning about wrong type of data
    result[:] = global_list      # replace values
    print(result)

    # df = pd.DataFrame(result)
    # df["TRANSACTION ID STR"] = global_list
    # print(df)


# --- main ---

version_global_result(df)

结果:

EMPLOYEE ID  ACCOUNT EMAIL ADDRESS     ACCOUNT NUMBER  MERCHANT NAME   TRANSACTION DATE
11608        [email protected]  116             Duffy's Lumber  2026-03-03                                      5416288523001
                                                       Lowes           2026-02-09                                      5416288521001
                                                       WB Mason        2026-01-03                                      5406965833001
                                                       corner store    2025-12-03                                      5403179702001
                                                                       2025-12-20                                      5403179704001
                                                                       2025-12-20                        5403179704001,5403179705001
                                                       nino's pizza    2026-01-25                                      5416288517001
                                                                       2026-02-02                        5416288517001,5416288519001
                                       608             Lowes           2026-01-29                                      5416288518001
                                                                       2026-02-05                        5416288518001,5416288520001
                                                                       2026-02-15                        5416288520001,5416288524001
                                                       Staples         2026-01-05                                      5406965834001
                                                                       2026-01-06                        5406965834001,5412746497001
                                                                       2026-01-06          5406965834001,5412746497001,5416288516001
                                                       corner store    2025-12-10                                      5403179703001
                                                                       2025-12-31                                      5405062431001
                                                       nino's pizza    2026-02-11                                      5416288522001
52846        [email protected]     456             Lowes           2025-12-10                                      5459405088001
                                                                       2025-12-31                                      5471834423001
                                                                       2026-01-06                        5471834423001,5347075493001
                                                       local hardware  2026-01-27                                      5347075494001
                                                                       2026-01-29                        5347075494001,5357832073001
                                                       nino's pizza    2026-02-11                                      5403179700001
                                                                       2026-03-03                                      5414434974001
                                                                       2026-04-10                                      5414434975001
                                       846             HARBOR FREIGHT  2025-12-02                                      5454344019001
                                                       corner store    2026-02-02                                      5361456559001
                                                                       2026-02-05                        5361456559001,5386878553001
                                                       nino's pizza    2025-12-20                                      5459405089001
                                                                       2026-01-01                                      5471834424001
                                                       pepe's pizza    2026-02-09                                      5401420274001
77400        [email protected]  400             Duffy's Lumber  2025-12-10                                      5353050810001
                                                                       2026-04-10                                      5451761818001
                                                                       2026-04-15                        5451761818001,5473621360001
                                                       HARBOR FREIGHT  2026-01-06                                      5390241877001
                                                                       2026-01-27                                      5401420255001
                                                                       2026-02-09                                      5425031382001
                                                       WB Mason        2026-02-05                                      5425031381001
                                       707             Duffy's Lumber  2025-12-02                                      5350647122001
                                                                       2025-12-23                                      5356156974001
                                                                       2025-12-31                        5356156974001,5359620179001
                                                                       2026-01-03                        5359620179001,5372912596001
                                                       HARBOR FREIGHT  2026-01-29                                      5409512783001
                                                       WB Mason        2026-02-02                                      5423349484001
                                                                       2026-02-11                        5423349484001,5451761817001
Name: TRANSACTION ID STR, dtype: object

如果你想保留其他值,那么你可以用字典来保存它们。

我做了一个关于索引(日期)的示例,但后来我发现它把错误的索引传给了函数——我也不知道为什么。不过我会把它保留为示例。

global_list = {"text": [], "dates": []}
def version_global_result(df):

    def join_strings(data):
        global global_list

        text = ",".join(data.dropna().astype(int).astype(str))
        global_list["text"].append(text)

        dates = data.index.strftime("%Y-%m-%d").to_list()
        global_list["dates"].append(dates)

        return 0  # anything (float/integer)

    # ---

    global global_list

    global_list = {"text": [], "dates": []}  # set empty before every execution

    result = (
        df.groupby(
            ["EMPLOYEE ID", "ACCOUNT EMAIL ADDRESS", "ACCOUNT NUMBER", "MERCHANT NAME"]
        )
        .rolling(window="11D")["TRANSACTION ID STR"]
        .apply(join_strings)
    )

    df = pd.DataFrame(result)

    df["TRANSACTION ID STR"] = global_list["text"]
    df["DATES"] = global_list["dates"]

    print(df)

结果

EMPLOYEE ID ACCOUNT EMAIL ADDRESS    ACCOUNT NUMBER MERCHANT NAME  TRANSACTION DATE
11608       [email protected] 116            Duffy's Lumber 2026-03-03                                    5416288523001                          [2025-12-02]
                                                    Lowes          2026-02-09                                    5416288521001                          [2025-12-10]
                                                    WB Mason       2026-01-03                                    5406965833001                          [2025-12-20]
                                                    corner store   2025-12-03                                    5403179702001                          [2025-12-31]
                                                                   2025-12-20                                    5403179704001                          [2026-01-01]
                                                                   2025-12-20                      5403179704001,5403179705001              [2026-01-01, 2026-01-06]
                                                    nino's pizza   2026-01-25                                    5416288517001                          [2026-01-27]
                                                                   2026-02-02                      5416288517001,5416288519001              [2026-01-27, 2026-01-29]
                                     608            Lowes          2026-01-29                                    5416288518001                          [2026-02-02]
                                                                   2026-02-05                      5416288518001,5416288520001              [2026-02-02, 2026-02-05]
                                                                   2026-02-15                      5416288520001,5416288524001              [2026-02-05, 2026-02-09]
                                                    Staples        2026-01-05                                    5406965834001                          [2026-02-11]
                                                                   2026-01-06                      5406965834001,5412746497001              [2026-02-11, 2026-03-03]
                                                                   2026-01-06        5406965834001,5412746497001,5416288516001  [2026-02-11, 2026-03-03, 2026-04-10]
                                                    corner store   2025-12-10                                    5403179703001                          [2025-12-02]
                                                                   2025-12-31                                    5405062431001                          [2025-12-10]
                                                    nino's pizza   2026-02-11                                    5416288522001                          [2025-12-23]
52846       [email protected]    456            Lowes          2025-12-10                                    5459405088001                          [2025-12-31]
                                                                   2025-12-31                                    5471834423001                          [2026-01-03]
                                                                   2026-01-06                      5471834423001,5347075493001              [2026-01-03, 2026-01-06]
                                                    local hardware 2026-01-27                                    5347075494001                          [2026-01-27]
                                                                   2026-01-29                      5347075494001,5357832073001              [2026-01-27, 2026-01-29]
                                                    nino's pizza   2026-02-11                                    5403179700001                          [2026-02-02]
                                                                   2026-03-03                                    5414434974001                          [2026-02-05]
                                                                   2026-04-10                                    5414434975001                          [2026-02-09]
                                     846            HARBOR FREIGHT 2025-12-02                                    5454344019001                          [2026-02-11]
                                                    corner store   2026-02-02                                    5361456559001                          [2026-04-10]
                                                                   2026-02-05                      5361456559001,5386878553001              [2026-04-10, 2026-04-15]
                                                    nino's pizza   2025-12-20                                    5459405089001                          [2025-12-03]
                                                                   2026-01-01                                    5471834424001                          [2025-12-10]
                                                    pepe's pizza   2026-02-09                                    5401420274001                          [2025-12-20]
77400       [email protected] 400            Duffy's Lumber 2025-12-10                                    5353050810001                          [2025-12-20]
                                                                   2026-04-10                                    5451761818001                          [2025-12-31]
                                                                   2026-04-15                      5451761818001,5473621360001              [2025-12-31, 2026-01-03]
                                                    HARBOR FREIGHT 2026-01-06                                    5390241877001                          [2026-01-05]
                                                                   2026-01-27                                    5401420255001                          [2026-01-06]
                                                                   2026-02-09                                    5425031382001                          [2026-01-06]
                                                    WB Mason       2026-02-05                                    5425031381001                          [2026-01-25]
                                     707            Duffy's Lumber 2025-12-02                                    5350647122001                          [2026-01-29]
                                                                   2025-12-23                                    5356156974001                          [2026-02-02]
                                                                   2025-12-31                      5356156974001,5359620179001              [2026-02-02, 2026-02-05]
                                                                   2026-01-03                      5359620179001,5372912596001              [2026-02-05, 2026-02-09]
                                                    HARBOR FREIGHT 2026-01-29                                    5409512783001                          [2026-02-11]
                                                    WB Mason       2026-02-02                                    5423349484001                          [2026-03-03]
                                                                   2026-02-11                      5423349484001,5451761817001              [2026-03-03, 2026-02-15]
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章