微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – pandas dataframe通过复制前一个数据帧的n次行并更改日期来创建新的数据帧

我有一个大约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

前两行’df’的循环结果如下.

前两行df:

enter image description here

期望的结果:

enter image description here

有没有其他方法来达到所需的输出.似乎熊猫不能很好地处理循环.在VBA excel中,相同的循环需要大约3/4分钟……我正在尝试将当前处于excel的进程更改为python,但是,如果没有办法使这项工作,我想我会坚持旧的方式. ..

解决方法:

使用重复和cumcount

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

细节

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐