首页 > 解决方案 > first() 没有在第一行添加

问题描述

我正在尝试根据第一行在 df 中添加新行。

id                        name                              value
111                   length                                46
111                   status                              completed
111                    segment                              21
555                     tp                                 0.1
555                     x                                  56
888                     point                              23.01
888                     x                                  50
888                     y                                  40

预期产出

     id                        name                              value
    111                       type                                description #new row
    111                    length                                46
    111                    status                              completed
    111                   segment                               21
    555                       type                               description  #new row
    555                    tp                                   0.1
    555                     x                                    56
    888                     type                                description  #new row
    888                     point                                23.01
    888                     x                                    50
    888                     y                                    40

我在尝试

new = df.groupby("id", as_index=False).first().assign(attribute='rdf:type', value='description')
df = pd.concat([new, df]).sort_values('id')

它只插入第一行,但随后在 x 之后添加 555 的最后一行,以及在其中添加的一些位置,例如,在 df 中有数千行之后。任何人都可以帮忙吗?

标签: pandaspostgresql

解决方案


定义以下函数:

def prepend(grp):
    new_row = pd.DataFrame([[ grp.iloc[0].id, 'type', 'description' ]],
        columns=grp.columns)
    return pd.concat([new_row, grp])

然后应用它:

result = df.groupby('id').apply(prepend).droplevel(level=0)\
    .reset_index(drop=True)

按照有关新行位置的评论进行编辑

对于您的示例数据(和自动生成的索引),我收到了正确的结果。

行顺序可能不同的一个原因是 DataFrame 中的某些行可能具有负索引。在这种情况下:

  • 第一个(添加的行)是使用 index == 0生成的,
  • 其他具有“原始”索引的,

因此连接顺序可能不同,例如使用一些旧版本的Pandas(我试图设置这样的负索引,但即便如此我仍然得到了正确的行序列)。

尝试将前面的最后一行更改为:

return pd.concat([new_row, grp], ignore_index=True)

即添加ignore_index=True

在这种情况下,旧索引值将被忽略,并且每个组中的索引值将是连续的数字。在最后一步(reset_index)中,它们将被新的连续数字序列覆盖,但至少每个prepend应用程序返回的结果中应该有正确的行顺序。


推荐阅读