熊猫:每 n 行重复 n 次值

我有一个包含 2563199 行的数据框。看起来像:


          index    dtm        f

      0     0   00:00:00    50.065

      1     1   00:00:01    50.061

      2     2   00:00:02    50.058

      3     3   00:00:03    50.049

      4     4   00:00:04    50.044

      5     5   00:00:05    50.044

      6     6   00:00:06    50.042

      7     7   00:00:07    50.042

    ....................

   2591997  2591997 23:59:57    50.009

   2591998  2591998 23:59:58    50.008

   2591999  2591999 23:59:59    50.006

我想创建一个新列,它重复包含每 n 行 n 次的值。例如,如果我在第 4 行设置重复值,它将在前 4 行中重复 50.049,在接下来的 4 行中重复值 50.042,依此类推。(如果数据帧的长度与确切的部门不匹配,则无关紧要)。像下面这样:


          index   dtm         f

      0     0   00:00:00    50.049

      1     1   00:00:01    50.049

      2     2   00:00:02    50.049          

      3     3   00:00:03    50.049

      4     4   00:00:04    50.042

      5     5   00:00:05    50.042

      6     6   00:00:06    50.042

      7     7   00:00:07    50.042

我每 86400 行就尝试一次:


arr = np.arange(len(df)) // 86400

for x in arr:

    df['value']=df['f'].iloc[x+86400]

任何的想法?谢谢你!


炎炎设计
浏览 191回答 2
2回答

蛊毒传说

使用numpy和数组切片import numpy as npn = 4df['fnew'] = np.concatenate([np.repeat(df.f.values[n-1::n], n),                             np.repeat(np.NaN, len(df)%n)])输出:n=3   index       dtm       f    fnew0      0  00:00:00  50.065  50.0581      1  00:00:01  50.061  50.0582      2  00:00:02  50.058  50.0583      3  00:00:03  50.049  50.0444      4  00:00:04  50.044  50.0445      5  00:00:05  50.044  50.0446      6  00:00:06  50.042     NaN7      7  00:00:07  50.042     NaNn = 4   index       dtm       f    fnew0      0  00:00:00  50.065  50.0491      1  00:00:01  50.061  50.0492      2  00:00:02  50.058  50.0493      3  00:00:03  50.049  50.0494      4  00:00:04  50.044  50.0425      5  00:00:05  50.044  50.0426      6  00:00:06  50.042  50.0427      7  00:00:07  50.042  50.042n = 5   index       dtm       f    fnew0      0  00:00:00  50.065  50.0441      1  00:00:01  50.061  50.0442      2  00:00:02  50.058  50.0443      3  00:00:03  50.049  50.0444      4  00:00:04  50.044  50.0445      5  00:00:05  50.044     NaN6      6  00:00:06  50.042     NaN7      7  00:00:07  50.042     NaN

偶然的你

这是一种避免循环的方法df。首先设置 a n,并生成一个包含现有索引的列表,不包括将用于重复 中值的行f:n=4ix = [x for i, x in enumerate(df.index.values) if (i + 1) % n != 0]print(ix)[0, 1, 2, 4, 5, 6]现在将这些值设置为np.nan并使用bfill:df.loc[ix, 'f'] = np.nandf['f'] = df.f.bfill()print(df)    index       dtm       f0      0  00:00:00  50.0491      1  00:00:01  50.0492      2  00:00:02  50.0493      3  00:00:03  50.0494      4  00:00:04  50.0425      5  00:00:05  50.0426      6  00:00:06  50.0427      7  00:00:07  50.042
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python