web-dev-qa-db-ja.com

Pandasシリーズに行をドロップし、インデックスをクリーンアップします

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が削除されることです。行「5NaN」を削除し、インデックス0〜8で-0.000052を維持したいと思います。これは私が望むものです。

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
12
Jonas

やや紛らわしいことに、reindexは「新しいインデックスを作成する」という意味ではありません。新しいインデックスを作成するには、index属性に割り当てるだけです。したがって、最後のステップでsample_mean_series.index = range(len(sample_mean_series))を実行するだけです。

12
BrenBarn

これがワンライナーです:

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を使用しない場合、インデックスは5なしで4から6にジャンプします。

デフォルトでは、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
10
Zelazny7