【问题标题】:pandas: for each row in df copy row N times with slight changespandas:对于df复制行中的每一行N次略有变化
【发布时间】:2015-08-16 18:20:31
【问题描述】:

所以我有一个这样的 DataFrame:

   N    start
1  1    08/01/2014 9:30:02
2  1    08/01/2014 10:30:02 
3  2    08/01/2014 12:30:02
4  3    08/01/2014 4:30:02

我需要将每一行复制 N 次,每次添加一小时开始,如下所示:

   N    start
1  1    08/01/2014 9:30:02
2  1    08/01/2014 10:30:02 
3  2    08/01/2014 12:30:02
3  2    08/01/2014 13:30:02
4  3    08/01/2014 4:30:02
4  3    08/01/2014 5:30:02
4  3    08/01/2014 6:30:02

如何在 pandas 中做到这一点?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以使用 reindex 来扩展 DataFrame,并使用 TimedeltaIndex 来添加小时数:

    import pandas as pd
    df = pd.DataFrame({'N': [1, 1, 2, 3],
                       'start': ['08/01/2014 9:30:02',
                                 '08/01/2014 10:30:02',
                                 '08/01/2014 12:30:02',
                                 '08/01/2014 4:30:02']})
    df['start'] = pd.to_datetime(df['start'])
    df = df.reindex(np.repeat(df.index.values, df['N']), method='ffill')
    df['start'] += pd.TimedeltaIndex(df.groupby(level=0).cumcount(), unit='h')
    

    产生

       N               start
    0  1 2014-08-01 09:30:02
    1  1 2014-08-01 10:30:02
    2  2 2014-08-01 12:30:02
    2  2 2014-08-01 13:30:02
    3  3 2014-08-01 04:30:02
    3  3 2014-08-01 05:30:02
    3  3 2014-08-01 06:30:02
    

    【讨论】:

    • 谢谢!我现在唯一不能理解的是:在第二个中你使用 for i in range(1,4): - 据我所知,我需要用自定义数字替换它,比如说,计算 df 中的最大 N,然后检查:如果 row.N
    • 我想我会使用第一种方法。第二种方法假定N 是常数。由于情况并非如此,因此很难正确连接 df 的副本。
    • 此方法比在此答案中使用 append 方法快得多:stackoverflow.com/a/24029921/698809
    【解决方案2】:

    这可能不是最有效的方法,但会给你带来结果:

    import pandas as pd
    l = []
    for index,item in df.iterrows():
        l.append([item[0],pd.to_datetime(item[1])])
        i=1
        # it was not clear if you want to repeat based on N or the index... if index then replace item[0] with index
        while i<item[0]:
            l.append([item[0],pd.to_datetime(item[1])+pd.Timedelta('1 hours')])
            i=i+1
    dfResult = pd.DataFrame(l,columns=['N','Start'])
    

    【讨论】:

    • 谢谢。这次我就是这样做的。但当然这是一种超慢的方法
    猜你喜欢
    • 2014-02-18
    • 2020-01-25
    • 2018-07-21
    • 2020-05-27
    • 2022-12-22
    • 2021-10-25
    • 2018-01-06
    • 2015-05-25
    • 1970-01-01
    相关资源
    最近更新 更多