是否可以使用pandas在数据框中的任意位置插入行?

时间:2013-04-08 20:45:02

标签: python pandas

我有一个类似于这个的DataFrame对象:

       onset    length
1      2.215    1.3
2     23.107    1.3
3     41.815    1.3
4     61.606    1.3
...

我想要做的是在某个索引值指定的位置插入一行,并相应地更新以下索引。 E.g:

       onset    length
1      2.215    1.3
2     23.107    1.3
3     30.000    1.3  # new row
4     41.815    1.3
5     61.606    1.3
...

最好的方法是什么?

5 个答案:

答案 0 :(得分:39)

你可以切片并使用concat来获得你想要的东西。

line = DataFrame({"onset": 30.0, "length": 1.3}, index=[3])
df2 = concat([df.iloc[:2], line, df.iloc[3:]]).reset_index(drop=True)

这将在示例输出中生成数据帧。据我所知,concat是在熊猫中实现插入类型操作的最佳方法,但不可否认,我绝不是熊猫专家。

答案 1 :(得分:11)

我发现排序而不是切片和连接更加可读。

line = DataFrame({"onset": 30.0, "length": 1.3}, index=[2.5])
df = df.append(line, ignore_index=False)
df = df.sort_index().reset_index(drop=True)

答案 2 :(得分:0)

line = DataFrame({"onset": 30.0, "length": 1.3}, index=[3])
df2 = concat([df.iloc[:2], line, df.iloc[3:]]).reset_index(drop=True)

此解决方案正在替换那些我只想添加一个索引而不替换索引值的索引值。

答案 3 :(得分:0)

我认为不使用concat或追加就更容易了:

df.loc[2.5] = 30.0, 1.3
df = df.sort_index().reset_index(drop=True)

(假设索引已提供,从1开始)

答案 4 :(得分:0)

如果您想保留原始索引,这可能会更好:

df = pd.DataFrame(dict(x=[0, 1, 2, 3, 4]))
df_update = pd.DataFrame(dict(x=[10, 11, 12]), index=[3, 4, 5])

# concat df_update first
df = pd.concat([df_update, df], axis=0)

# drop duplicates, updates will be prioritized
df = df.iloc[df.index.drop_duplicates()]

# sort to regain order
df.sort_index(inplace=True)