pandas 数据框通过复制前一个数据框的 n 行并更改日期来创建一个新的数据框

dap*_*paz 5 python loops rows dataframe pandas

我有一个大约有 9k 行和 57 列的数据框,这是“df”。

我需要一个新的数据框:'df_final' - 对于 'df' 的每一行,我必须复制每一行 'x' 次,并逐行增加每一行的天数,也是 'x' 次。虽然我可以在几次迭代中执行此操作,但当我为 'df' 'len(df)' 的全长执行此操作时,循环需要很长时间(> 3 小时),以至于我实际上不得不取消它。我从未见过它的尽头。这是当前的代码:

df.shape
output: (9454, 57)

df_int = df[0:0]
df_final = df_int[0:0]
range_df = len(df)
for x in range(0,2):
    df_int = df.iloc[0+x:x+1]
    if abs(df_int.iat[-1,3]) > 0:
        df_int = pd.concat([df_int]*abs(df_int.iat[-1,3]), ignore_index=True)
        for i in range(1, abs(df_int.iat[-1,3])):
            df_int['Consumption Date'][i] = df_int['Consumption Date'][i-1] + datetime.timedelta(days = 1)
            i += 1
       df_final = df_final.append(df_int, ignore_index=True)
    x += 1
Run Code Online (Sandbox Code Playgroud)

'df' 前两行的循环结果如下。

df的前两行: 在此处输入图片说明

想要的结果: 在此处输入图片说明

是否有另一种方法可以获得所需的输出。似乎熊猫不太擅长处理循环。在 VBA excel 中,相同的循环大约需要 3/4 分钟……我正在尝试将当前在 excel 中的进程更改为 python,但是,如果无法完成这项工作,我想我会坚持使用旧方法。 ..

Zer*_*ero 4

使用repeatcumcount

In [2972]: dff = df.loc[df.index.repeat(3)]

In [2973]: dff
Out[2973]:
        date   name
0 2017-05-03    bob
0 2017-05-03    bob
0 2017-05-03    bob
1 2017-06-13  sally
1 2017-06-13  sally
1 2017-06-13  sally

In [2974]: dff.loc[:, 'date'] += pd.to_timedelta(dff.groupby(level=0).cumcount(), 'D')

In [2975]: dff
Out[2975]:
        date   name
0 2017-05-03    bob
0 2017-05-04    bob
0 2017-05-05    bob
1 2017-06-13  sally
1 2017-06-14  sally
1 2017-06-15  sally
Run Code Online (Sandbox Code Playgroud)

细节

In [2976]: df
Out[2976]:
        date   name
0 2017-05-03    bob
1 2017-06-13  sally

In [2977]: dff.groupby(level=0).cumcount()
Out[2977]:
0    0
0    1
0    2
1    0
1    1
1    2
dtype: int64
Run Code Online (Sandbox Code Playgroud)