87

シリアル化されたパンダ シリーズに 1 つのアイテムを追加するにはどうすればよいですか。私はそれがメモリに関して最も効率的な方法ではないことを知っていますが、それでもそれを行う必要があります。

何かに沿って:

>> x = Series()
>> N = 4
>> for i in xrange(N):
>>     x.some_appending_function(i**2)    
>> print x

0 | 0
1 | 1
2 | 4
3 | 9

また、pandas DataFrame に単一の行を追加するにはどうすればよいですか?

4

8 に答える 8

49

単品の追加方法。これはあまり効果的ではありませんが、あなたが求めていることに従います:

x = p.Series()
N = 4
for i in xrange(N):
   x = x.set_value(i, i**2)

x: を生成します。

0    0
1    1
2    4
3    9

明らかに、このシリーズを 1 回のショットで生成するより良い方法があります。

2 番目の質問のチェックの回答と SO の質問の参照については、 pandas.DataFrame に 1 行を追加します。

于 2012-11-11T15:42:23.360 に答える
45

TLDR: 項目を 1 つずつシリーズに追加しないでください。順序付けられたコレクションで拡張することをお勧めします

現在の形式の質問は少しトリッキーだと思います。そして、受け入れられた答えは質問に答えます。しかし、pandas を使えば使うほど、シリーズにアイテムを 1 つずつ追加するのは良くない考えだと理解するようになりました。パンダの初心者向けに理由を説明しようと思います。

特定の Series にデータを追加すると、一部のリソースを再利用できると思うかもしれませんが、実際には、Series はインデックスと値配列の間の関係を格納するコンテナーにすぎません。それぞれがボンネットの下の numpy.array であり、インデックスは不変です。インデックスにないラベルを持つアイテムを Series に追加すると、サイズ n+1 の新しいインデックスが作成され、同じサイズの新しい値の配列が作成されます。つまり、項目を 1 つずつ追加すると、各ステップで n+1 サイズの配列がさらに 2 つ作成されます。

ところで、位置によって新しいアイテムを追加することはできません (IndexError が発生します)。また、インデックスのラベルは一意である必要はありません。この場合、新しい行は追加されません。これにより、微妙なバグが発生する可能性があります。

この話の教訓は、データを 1 つずつ追加するのではなく、順序付けられたコレクションで拡張することです。問題は、シリーズをインプレースで拡張できないことです。そのため、シリーズの特定のインスタンスを参照によって更新する必要がないように、コードを編成する方が適切です。

自分でラベルを作成し、それらが増加している場合、最も簡単な方法は、辞書に新しい項目を追加してから、辞書から新しいシリーズを作成し (キーを並べ替えます)、そのシリーズを古いものに追加することです。キーが増えていない場合は、新しいラベルと新しい値用に 2 つの個別のリストを作成する必要があります。

以下は、いくつかのコード サンプルです。

In [1]: import pandas as pd
In [2]: import numpy as np

In [3]: s = pd.Series(np.arange(4)**2, index=np.arange(4))

In [4]: s
Out[4]:
0    0
1    1
2    4
3    9
dtype: int64

In [6]: id(s.index), id(s.values)
Out[6]: (4470549648, 4470593296)

既存のアイテムを更新すると、インデックスと値の配列は同じままです (値の型を変更しない場合)

In [7]: s[2] = 14  

In [8]: id(s.index), id(s.values)
Out[8]: (4470549648, 4470593296)

しかし、新しいアイテムを追加すると、新しいインデックスと新しい値の配列が生成されます。

In [9]: s[4] = 16

In [10]: s
Out[10]:
0     0
1     1
2    14
3     9
4    16
dtype: int64

In [11]: id(s.index), id(s.values)
Out[11]: (4470548560, 4470595056)

つまり、複数の項目を追加して辞書に集め、シリーズを作成し、それを古いものに追加して結果を保存する場合です。

In [13]: new_items = {item: item**2 for item in range(5, 7)}

In [14]: s2 = pd.Series(new_items)

In [15]: s2  # keys are guaranteed to be sorted!
Out[15]:
5    25
6    36
dtype: int64

In [16]: s = s.append(s2); s
Out[16]:
0     0
1     1
2    14
3     9
4    16
5    25
6    36
dtype: int64
于 2016-06-23T13:16:57.263 に答える
15

append 関数を使用して、別の要素を追加できます。追加する前に、一連の新しい要素を作成してください。

test = test.append(pd.Series(200, index=[101]))
于 2012-11-19T15:03:18.223 に答える