在Pandas系列中删除行并清理索引

22 投票
4 回答
36005 浏览
提问于 2025-04-17 13:26

我有一个Pandas的Series(类似于一个列表),我想根据一个随机生成的数字来选择一行(代码示例中是第5行),然后把这一行删除。删除后,我希望剩下的行能重新编号,从0到8。下面是代码:

print 'Original series: ', sample_mean_series
print 'Length of original series', len(sample_mean_series)
sample_mean_series = sample_mean_series.drop([5],axis=0)
print 'Series with item 5 dropped: ', sample_mean_series
print 'Length of modified series:', len(sample_mean_series)
print sample_mean_series.reindex(range(len(sample_mean_series)))

这是运行后的结果:

Original series:  
0    0.000074
1   -0.000067
2    0.000076
3   -0.000017
4   -0.000038
5   -0.000051
6    0.000125
7   -0.000108
8   -0.000009
9   -0.000052
Length of original series 10
Series with item 5 dropped:  
0    0.000074
1   -0.000067
2    0.000076
3   -0.000017
4   -0.000038
6    0.000125
7   -0.000108
8   -0.000009
9   -0.000052
Length of modified series: 9
0    0.000074
1   -0.000067
2    0.000076
3   -0.000017
4   -0.000038
5         NaN
6    0.000125
7   -0.000108
8   -0.000009

我的问题是,第8行被删除了。我想删除的是“5 NaN”这一行,而保留-0.000052,并且希望剩下的行的索引能从0到8。这样看起来才是我想要的:

0    0.000074
1   -0.000067
2    0.000076
3   -0.000017
4   -0.000038
5    0.000125
6   -0.000108
7   -0.000009
8   -0.000052

4 个回答

0

要在一个数据框中删除行,并且整理索引:

b = df['amount'] > 10000
df_dropped = df.drop(df[~b].index).reset_index()
15

这里有一句简单的代码:

In [1]: s
Out[1]:
0   -0.942184
1    0.397485
2   -0.656745
3    1.415797
4    1.123858
5   -1.890870
6    0.401715
7   -0.193306
8   -1.018140
9    0.262998

我用 Series.drop 方法来删除第5行,然后用 reset_index 来重新编号索引,使它们变得连续。如果不使用 reset_index,索引就会从4跳到6,中间没有5。

默认情况下,reset_index 会把原来的索引放到一个 DataFrame 里,并把它和系列的值一起返回。如果传入 drop=True,就不会发生这种情况。

In [2]: s2 = s.drop([5]).reset_index(drop=True)

In [3]: s2
Out[3]:
0   -0.942184
1    0.397485
2   -0.656745
3    1.415797
4    1.123858
5    0.401715
6   -0.193306
7   -1.018140
8    0.262998
Name: 0
17

有点让人困惑的是,reindex 并不是说“创建一个新的索引”。如果你想创建一个新的索引,只需要给 index 属性赋值就可以了。所以在你最后一步的时候,只需要这样做:sample_mean_series.index = range(len(sample_mean_series))

撰写回答