You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按条件在DataFrame的目标行前插入指定格式的新行?

问题描述

现有如下Pandas DataFrame:

name abbreviation     X     Y  Quantity Max Quantity
0    A-x            A  15.6  19.4         1            2
1   A-y2            A  15.6  19.4         2            2
2    B-a            B  15.0  25.0         1            2
3    B-d            B  15.0  25.0         2            2
4   C-x1            C  15.0  10.0         1            3
5   C-c4            C  15.0  10.0         2            3
6    C-5            C  15.0  10.0         3            3
7    E-v            E  83.4  16.5         1            4
8    E-2            E  83.4  16.5         2            4
9   E-v2            E  83.4  16.5         3            4
10   E-1            E  83.4  16.5         4            4 
11  F-ab            F  19.1  98.4         1            2
12  F-nb            F  19.1  98.4         2            2
13  G-ku            G  78.0  17.0         1            1

该DataFrame按X、Y坐标分组,每组的Max Quantity为组内最大数量。需要为每组坐标的首行前插入一行新数据:

  • name取对应组的abbreviation值
  • X、Y与组内数据一致
  • Quantity设为0

最终效果如下:

name site_abbreviation  POS_X  POS_Y  Quantity  Max Quantity
0      A                 A   15.6   19.4         0             2
1    A-x                 A   15.6   19.4         1             2
2   A-y2                 A   15.6   19.4         2             2
3      B                 B   15.0   25.0         0             2
4    B-a                 B   15.0   25.0         1             2
5    B-d                 B   15.0   25.0         2             2
6      C                 C   15.0   10.0         0             3
7   C-x1                 C   15.0   10.0         1             3
8   C-c4                 C   15.0   10.0         2             3
9    C-5                 C   15.0   10.0         3             3
10     E                 E   83.4   16.5         0             4
11   E-v                 E   83.4   16.5         1             4
12   E-2                 E   83.4   16.5         2             4
13  E-v2                 E   83.4   16.5         3             4
14   E-1                 E   83.4   16.5         4             4
15     F                 F   19.1   98.4         0             2
16  F-ab                 F   19.1   98.4         1             2
17  F-nb                 F   19.1   98.4         2             2
18     G                 G   78.0   17.0         0             1
19  G-ku                 G   78.0   17.0         1             1
解决方案

可以通过分组生成插入行、合并数据后排序的方式实现,具体代码如下:

import pandas as pd

# 构造原始DataFrame
data = {
    'name': ['A-x', 'A-y2', 'B-a', 'B-d', 'C-x1', 'C-c4', 'C-5', 'E-v', 'E-2', 'E-v2', 'E-1', 'F-ab', 'F-nb', 'G-ku'],
    'abbreviation': ['A', 'A', 'B', 'B', 'C', 'C', 'C', 'E', 'E', 'E', 'E', 'F', 'F', 'G'],
    'X': [15.6, 15.6, 15.0, 15.0, 15.0, 15.0, 15.0, 83.4, 83.4, 83.4, 83.4, 19.1, 19.1, 78.0],
    'Y': [19.4, 19.4, 25.0, 25.0, 10.0, 10.0, 10.0, 16.5, 16.5, 16.5, 16.5, 98.4, 98.4, 17.0],
    'Quantity': [1, 2, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 1],
    'Max Quantity': [2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 2, 2, 1]
}
df = pd.DataFrame(data)

# 生成每组的插入行:取每组首行,修改name为abbreviation,Quantity设为0
insert_rows = df.groupby('abbreviation').first().reset_index()
insert_rows['name'] = insert_rows['abbreviation']
insert_rows['Quantity'] = 0

# 合并原始数据和插入行
combined_df = pd.concat([df, insert_rows], ignore_index=True)

# 按X、Y分组排序,每组内按Quantity从小到大排列,确保插入的0行在最前面
combined_df = combined_df.sort_values(by=['X', 'Y', 'Quantity'], ignore_index=True)

# 重命名列名以匹配最终效果(如果不需要可跳过)
combined_df = combined_df.rename(columns={
    'abbreviation': 'site_abbreviation',
    'X': 'POS_X',
    'Y': 'POS_Y'
})

# 输出结果
print(combined_df)

代码说明

  1. 生成插入行:通过groupby('abbreviation').first()获取每组的首行数据,修改name为组的缩写,Quantity设为0,得到所有需要插入的行。
  2. 合并数据:用pd.concat将原始数据和插入行合并成一个新的DataFrame。
  3. 排序调整顺序:按X、Y分组,组内按Quantity升序排列,这样每组的Quantity=0的行就会排在最前面。
  4. 列名修改:可选步骤,将列名调整为示例中的格式。

内容的提问来源于stack exchange,提问作者maxwell_742

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 17:05:21