15

我有一个 Pandas 系列,我想根据一个随机数选择一行(在下面的代码示例中为 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

4 回答 4

14

这是一个单行:

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会将原始索引移动到 a 中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
于 2013-01-23T19:24:09.740 回答
14

有点令人困惑,reindex并不意味着“创建新索引”。要创建新索引,只需分配给index属性。所以在你的最后一步只是做sample_mean_series.index = range(len(sample_mean_series))

于 2013-01-23T19:17:24.333 回答
0
df.reset_index(drop=True, inplace = True)

会做你想做的事。

重置索引时,旧索引将添加为列,并使用新的顺序索引。您可以使用 drop 参数来避免将旧索引添加为列。

于 2021-11-25T10:55:53.073 回答
0

To drop rows in a dataframe and clean up index:

b = df['amount'] > 10000
df_dropped = df.drop(df[~b].index).reset_index()
于 2021-05-23T16:58:45.433 回答