为了账号安全,请及时绑定邮箱和手机立即绑定

熊猫:每 n 行重复 n 次值

熊猫:每 n 行重复 n 次值

炎炎设计 2021-09-14 15:47:49
我有一个包含 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)) // 86400for x in arr:    df['value']=df['f'].iloc[x+86400]任何的想法?谢谢你!
查看完整描述

2 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

使用numpy和数组切片


import numpy as np


n = 4

df['fnew'] = np.concatenate([np.repeat(df.f.values[n-1::n], n),

                             np.repeat(np.NaN, len(df)%n)])

输出:

n=3

   index       dtm       f    fnew

0      0  00:00:00  50.065  50.058

1      1  00:00:01  50.061  50.058

2      2  00:00:02  50.058  50.058

3      3  00:00:03  50.049  50.044

4      4  00:00:04  50.044  50.044

5      5  00:00:05  50.044  50.044

6      6  00:00:06  50.042     NaN

7      7  00:00:07  50.042     NaN


n = 4

   index       dtm       f    fnew

0      0  00:00:00  50.065  50.049

1      1  00:00:01  50.061  50.049

2      2  00:00:02  50.058  50.049

3      3  00:00:03  50.049  50.049

4      4  00:00:04  50.044  50.042

5      5  00:00:05  50.044  50.042

6      6  00:00:06  50.042  50.042

7      7  00:00:07  50.042  50.042


n = 5

   index       dtm       f    fnew

0      0  00:00:00  50.065  50.044

1      1  00:00:01  50.061  50.044

2      2  00:00:02  50.058  50.044

3      3  00:00:03  50.049  50.044

4      4  00:00:04  50.044  50.044

5      5  00:00:05  50.044     NaN

6      6  00:00:06  50.042     NaN

7      7  00:00:07  50.042     NaN


查看完整回答
反对 回复 2021-09-14
?
偶然的你

TA贡献1841条经验 获得超3个赞

这是一种避免循环的方法df。


首先设置 a n,并生成一个包含现有索引的列表,不包括将用于重复 中值的行f:


n=4

ix = [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.nan

df['f'] = df.f.bfill()


print(df)

    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


查看完整回答
反对 回复 2021-09-14
  • 2 回答
  • 0 关注
  • 190 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信