首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >插入带有指定结转值的新行

插入带有指定结转值的新行
EN

Stack Overflow用户
提问于 2021-12-28 00:50:41
回答 3查看 45关注 0票数 1

假设我有以下数据:

代码语言:javascript
运行
复制
    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差更大的行,并且新行的值取它前面的值。以下是预期的产出:

代码语言:javascript
运行
复制
    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

做这件事的好方法是什么?谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-12-28 02:15:28

让我们做set_index + reindex

代码语言:javascript
运行
复制
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
票数 0
EN

Stack Overflow用户

发布于 2021-12-28 00:54:46

您可以使用df['length'].diff计算每个索引的重复次数,并使用df.index.repeat根据这些值重复索引的项。然后可以使用结果的重复索引对数据进行索引,并使用df.assign添加一个列,该列包含从length列的最小值到最大值(都包括在内)的范围。

代码语言:javascript
运行
复制
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
    ))
)

输出:

代码语言:javascript
运行
复制
>>> 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

紧凑版:

代码语言:javascript
运行
复制
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))
票数 2
EN

Stack Overflow用户

发布于 2021-12-28 01:15:00

使用reindex的另一个选项

代码语言:javascript
运行
复制
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.9

运行示例:https://akuiper.com/console/fsm1iI6PIhxA

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70501792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档