如何按条件在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)
代码说明
- 生成插入行:通过
groupby('abbreviation').first()获取每组的首行数据,修改name为组的缩写,Quantity设为0,得到所有需要插入的行。 - 合并数据:用
pd.concat将原始数据和插入行合并成一个新的DataFrame。 - 排序调整顺序:按
X、Y分组,组内按Quantity升序排列,这样每组的Quantity=0的行就会排在最前面。 - 列名修改:可选步骤,将列名调整为示例中的格式。
内容的提问来源于stack exchange,提问作者maxwell_742
相关产品推荐
相关产品推荐

