【问题标题】:How to create a new row on the fly by copying previous row如何通过复制前一行动态创建新行
【发布时间】:2020-01-07 02:41:39
【问题描述】:

我有一个如下所示的数据框

编辑的数据框

df = pd.DataFrame({
'subject_id':[1,1,1,1,1,1,1,2,2,2,2,2],
'time_1' :['2173-04-03 12:35:00','2173-04-03 12:50:00','2173-04-05 12:59:00','2173-05-04 13:14:00','2173-05-05 13:37:00','2173-07-06 13:39:00','2173-07-08 11:30:00','2173-04-08 16:00:00','2173-04-09 22:00:00','2173-04-11 04:00:00','2173- 04-13 04:30:00','2173-04-14 08:00:00'],
 'val' :[5,5,5,5,1,6,5,5,8,3,4,6]})
df['time_1'] = pd.to_datetime(df_yes['time_1'])
df['day'] = df['time_1'].dt.day

我想做的是创建一个新记录

如下图所示,你可以看到subject_id = 1,他的4th一天的记录丢失了。所以我想做的是`复制前一行

我在下面试过但没有帮助

df.groupby('subject_id)['day'].eq(df['day'].shift(-1)).add(1)    

新记录的内容应与上一行相同,但应修改日期值(d+1),如下所示

我希望每个subject_id 的输出如下所示。你可以看看new record for day 4 is added。请注意,新行的时间部分并不重要。它可以是任何东西 (00:00:00)。

我只想在一个月的某个范围内添加缺失的日期。例如主题 = 1,第 4 个月有从 3 日到 5 日的记录。但缺少第 4 个。因此,我们仅添加第 4 天的记录。我们不需要 6th,7th 等

编辑输出

【问题讨论】:

    标签: python python-3.x pandas dataframe pandas-groupby


    【解决方案1】:

    在删除时间之后有重复的dates,因此您可以创建具有每个subject_id 的所有日期的助手DataFrame:

    df1 = (df.set_index('date')
             .groupby('subject_id')
             .resample('d')
             .last()
             .index
             .to_frame(index=False))
    print (df1)
        subject_id       date
    0            1 2173-04-03
    1            1 2173-04-04
    2            1 2173-04-05
    3            1 2173-04-06
    4            2 2173-04-08
    5            2 2173-04-09
    6            2 2173-04-10
    7            2 2173-04-11
    8            2 2173-04-12
    9            2 2173-04-13
    10           2 2173-04-14
    

    然后将DataFrame.merge 与左连接和前向填充缺失值一起使用:

    df2 = df1.merge(df, how='left').groupby('subject_id', as_index=False).ffill()
    

    Last 是必要的,将天数添加到新添加的日期时间,一种可能的解决方案是添加由新 time_1 值与 dates 之间的差异创建的 timedeltas:

    dates = df2['time_1'].dt.normalize() 
    df2['time_1'] += np.where(dates == df2['date'], 0, df2['date'] - dates)
    df2['day'] = df2['time_1'].dt.day
    df2['val'] = df2['val'].astype(int)
    print (df2)
    
             date              time_1  val  day
    0  2173-04-03 2173-04-03 12:35:00    5    3
    1  2173-04-03 2173-04-03 12:50:00    5    3
    2  2173-04-03 2173-04-03 12:59:00    5    3
    3  2173-04-04 2173-04-04 13:14:00    5    4
    4  2173-04-04 2173-04-04 13:37:00    1    4
    5  2173-04-05 2173-04-05 13:37:00    1    5
    6  2173-04-06 2173-04-06 13:39:00    6    6
    7  2173-04-06 2173-04-06 11:30:00    5    6
    8  2173-04-08 2173-04-08 16:00:00    5    8
    9  2173-04-09 2173-04-09 22:00:00    8    9
    10 2173-04-10 2173-04-10 22:00:00    8   10
    11 2173-04-11 2173-04-11 04:00:00    3   11
    12 2173-04-12 2173-04-12 04:00:00    3   12
    13 2173-04-13 2173-04-13 04:30:00    4   13
    14 2173-04-14 2173-04-14 08:00:00    6   14
    

    【讨论】:

    • 感谢您的回答。非常感谢您的帮助
    • 嗨,关于如何解决我在为我的真实数据执行上述代码时遇到的memory error 的任何想法?
    • 这行 df2['time_1'] += np.where(dates == df2['date'], 0, df2['date'] - dates) 抛出错误。我的意思是内存错误。
    • 数据集大小也很小。 139663记录
    • @SSMK - 只知道df2['time_1'] += np.where(dates == df2['date'], pd.Timedelta(0), df2['date'] - dates)df2['time_1'] += np.where(dates == df2['date'], np.timedelta64(0), df2['date'] - dates) ?
    猜你喜欢
    • 2022-10-24
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    相关资源
    最近更新 更多