每隔4行重复一次数值,并使用前面的行填充其余部分

6
我想创建一个新的列,使其每4行重复一次其他列。使用起始行来填充中间的行。例如对于df
d = {'col1': range(1,10)}
df = pd.DataFrame(data=d)

我希望创建一个返回以下结果的 col2:

col1    col2
1        1
2        1
3        1
4        1
5        5
6        5
7        5
8        5
9        9

这是我的尝试

df['col2'] = np.concatenate([np.repeat(df.col1.values[0::4], 4),
                             np.repeat(np.NaN, len(df)%3)])

出现错误: 值错误: 值的长度与索引的长度不匹配

如果将4更改为3,则代码可以运行,因为 len(df) 是9。我希望能够编写更通用的代码。

1个回答

1
这里有一种方法,使用 Dataframe.groupby.cumcount + pandas.Series.shift 来创建掩码。使用掩码填充 col2col1 相同,并使用 Series.ffill 填充缺失值。
g = df.groupby(df.index % 4).cumcount()
mask = g.ne(g.shift(1))

0     True
1    False
2    False
3    False
4     True
5    False
6    False
7    False
8     True
dtype: bool

df.loc[mask, 'col2'] = df.loc[mask, 'col1']

   col1  col2
0     1   1.0
1     2   NaN
2     3   NaN
3     4   NaN
4     5   5.0
5     6   NaN
6     7   NaN
7     8   NaN
8     9   9.0

df['col2'].ffill(inplace=True)

   col1  col2
0     1   1.0
1     2   1.0
2     3   1.0
3     4   1.0
4     5   5.0
5     6   5.0
6     7   5.0
7     8   5.0
8     9   9.0

1
这很完美。谢谢! - Warrior

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接