假设我有以下数据:
value length
0 2.4 3
1 5.3 6
2 17.1 8
3 11.9 11
df = pd.DataFrame([(2.4, 3),(5.3, 6),(17.1, 8),(11.9, 11)], columns=['value', 'length'])列length为整数且严格递增。我想在列1中插入比length差更大的行,并且新行的值取它前面的值。以下是预期的产出:
value length
0 2.4 3
1 2.4 4
2 2.4 5
3 5.3 6
4 5.3 7
5 17.1 8
6 17.1 9
7 17.1 10
8 11.9 11做这件事的好方法是什么?谢谢。
发布于 2021-12-28 02:15:28
让我们做set_index + reindex
out = df.set_index('length').\
reindex(range(df.length.min(),df.length.max()+1),method = 'ffill').reset_index()
length value
0 3 2.4
1 4 2.4
2 5 2.4
3 6 5.3
4 7 5.3
5 8 17.1
6 9 17.1
7 10 17.1
8 11 11.9发布于 2021-12-28 00:54:46
您可以使用df['length'].diff计算每个索引的重复次数,并使用df.index.repeat根据这些值重复索引的项。然后可以使用结果的重复索引对数据进行索引,并使用df.assign添加一个列,该列包含从length列的最小值到最大值(都包括在内)的范围。
df = (
df.loc[
df.index.repeat(
df['length']
.diff()
.shift(-1, fill_value=1)
)
]
.reset_index(drop=True)
.assign(length=np.arange(
df['length'].min(),
df['length'].max() + 1
))
)输出:
>>> df
value length
0 2.4 3
1 2.4 4
2 2.4 5
3 5.3 6
4 5.3 7
5 17.1 8
6 17.1 9
7 17.1 10
8 11.9 11紧凑版:
df = df.loc[df.index.repeat(df['length'].diff().shift(-1, fill_value=1))].reset_index(drop=True).assign(length=np.arange(df['length'].min(), df['length'].max()+1))发布于 2021-12-28 01:15:00
使用reindex的另一个选项
df.set_index('length')
.reindex(np.arange(df.length.min(), df.length.max() + 1))
.ffill()
.reset_index()
length value
0 3 2.4
1 4 2.4
2 5 2.4
3 6 5.3
4 7 5.3
5 8 17.1
6 9 17.1
7 10 17.1
8 11 11.9https://stackoverflow.com/questions/70501792
复制相似问题