pandas - 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 中有数千行之后。任何人都可以帮忙吗?
解决方案
定义以下函数:
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应用程序返回的结果中应该有正确的行顺序。
推荐阅读
- r - 通过 xpath selenium phantomjs 查找元素
- sql - 当 NOT NULL 时将多行更新为 NULL
- java - JPA - 按录取表格状态计数(状态类型枚举)
- spring-mvc - 使用 thymeleaf 将 MVC 映射到模板
- android - 在 DrawerNavigator 的子项之间传递 React-Native 的 props/params
- python - Python 在悬停/单击网格时显示相应的配置文件
- php - Laravel 删除论坛的一个线程
- wcf - 使用通道工厂而不是使用代理或添加服务引用来使用外部 WCF 服务
- reactjs - React Boostrap - TypeError:无法读取未定义的属性“bool”
- go - 去继承任务处理