82

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

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

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

       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
...

最好的方法是什么?

4

5 回答 5

83

你可以切片并使用 concat 来得到你想要的。

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

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

于 2013-04-08T21:10:49.017 回答
34

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

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)
于 2018-07-27T15:22:28.707 回答
15

我认为没有 concat 或 append 会更容易:

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

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

于 2020-09-04T06:57:09.877 回答
2
line = DataFrame({"onset": 30.0, "length": 1.3}, index=[3])
df2 = concat([df.iloc[:2], line, df.iloc[3:]]).reset_index(drop=True)

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

于 2019-10-23T09:14:39.060 回答
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)
于 2021-07-21T21:45:55.563 回答