1220

Pandas は完全に入力された をロードするように設計されていることは理解していますが、空の DataFrame を作成してから行を 1 つずつ追加するDataFrame必要があります。これを行う最善の方法は何ですか?

以下を使用して、空の DataFrame を正常に作成しました。

res = DataFrame(columns=('lib', 'qty1', 'qty2'))

次に、新しい行を追加して、フィールドに次の情報を入力します。

res = res.set_value(len(res), 'qty1', 10.0)

動作しますが、非常に奇妙に思えます :-/ (文字列値の追加に失敗します。)

DataFrame に新しい行を (異なる列タイプで) 追加するにはどうすればよいですか?

4

31 に答える 31

687

データ フレームのすべてのデータを事前に取得できる場合は、データ フレームに追加するよりもはるかに高速な方法があります。

  1. 各ディクショナリが入力データ行に対応するディクショナリのリストを作成します。
  2. このリストからデータ フレームを作成します。

行ごとにデータフレームに追加するのに30分かかり、辞書のリストからデータフレームを作成するのに数秒で完了する同様のタスクがありました。

rows_list = []
for row in input_rows:

        dict1 = {}
        # get input row in dictionary format
        # key = col_name
        dict1.update(blah..) 

        rows_list.append(dict1)

df = pd.DataFrame(rows_list)               
于 2013-07-05T20:38:13.783 に答える
327

pandas.concat()またはを使用できますDataFrame.append()。詳細と例については、マージ、結合、および連結を参照してください。

于 2012-05-23T08:14:43.650 に答える
79

オプションを使用して、単一の行を辞書として追加できignore_indexます。

>>> f = pandas.DataFrame(data = {'Animal':['cow','horse'], 'Color':['blue', 'red']})
>>> f
  Animal Color
0    cow  blue
1  horse   red
>>> f.append({'Animal':'mouse', 'Color':'black'}, ignore_index=True)
  Animal  Color
0    cow   blue
1  horse    red
2  mouse  black
于 2016-02-23T16:43:07.890 に答える
76

効率的な追加については、余分な行を pandas データフレームに追加する方法と拡大設定を参照してください。

存在loc/ixしないキー インデックス データを介して行を追加します。例えば:

In [1]: se = pd.Series([1,2,3])

In [2]: se
Out[2]:
0    1
1    2
2    3
dtype: int64

In [3]: se[5] = 5.

In [4]: se
Out[4]:
0    1.0
1    2.0
2    3.0
5    5.0
dtype: float64

または:

In [1]: dfi = pd.DataFrame(np.arange(6).reshape(3,2),
   .....:                 columns=['A','B'])
   .....:

In [2]: dfi
Out[2]:
   A  B
0  0  1
1  2  3
2  4  5

In [3]: dfi.loc[:,'C'] = dfi.loc[:,'A']

In [4]: dfi
Out[4]:
   A  B  C
0  0  1  0
1  2  3  2
2  4  5  4
In [5]: dfi.loc[3] = 5

In [6]: dfi
Out[6]:
   A  B  C
0  0  1  0
1  2  3  2
2  4  5  4
3  5  5  5
于 2014-04-30T17:31:04.917 に答える
15

これは OP の質問に対する回答ではありませんが、非常に役立つと思われるShikharDua の回答を説明するおもちゃの例です。

このフラグメントは些細なことですが、実際のデータには 1,000 の行と多数の列があり、異なる列でグループ化し、複数のターゲット列に対して以下の統計を実行できるようにしたいと考えていました。そのため、一度に 1 行ずつデータ フレームを構築するための信頼できる方法があると、非常に便利でした。ありがとうシカールドゥア!

import pandas as pd

BaseData = pd.DataFrame({ 'Customer' : ['Acme','Mega','Acme','Acme','Mega','Acme'],
                          'Territory'  : ['West','East','South','West','East','South'],
                          'Product'  : ['Econ','Luxe','Econ','Std','Std','Econ']})
BaseData

columns = ['Customer','Num Unique Products', 'List Unique Products']

rows_list=[]
for name, group in BaseData.groupby('Customer'):
    RecordtoAdd={} #initialise an empty dict
    RecordtoAdd.update({'Customer' : name}) #
    RecordtoAdd.update({'Num Unique Products' : len(pd.unique(group['Product']))})
    RecordtoAdd.update({'List Unique Products' : pd.unique(group['Product'])})

    rows_list.append(RecordtoAdd)

AnalysedData = pd.DataFrame(rows_list)

print('Base Data : \n',BaseData,'\n\n Analysed Data : \n',AnalysedData)
于 2016-07-13T09:49:18.073 に答える
4

それを行う別の方法(おそらくあまりパフォーマンスが高くありません):

# add a row
def add_row(df, row):
    colnames = list(df.columns)
    ncol = len(colnames)
    assert ncol == len(row), "Length of row must be the same as width of DataFrame: %s" % row
    return df.append(pd.DataFrame([row], columns=colnames))

次のように DataFrame クラスを拡張することもできます。

import pandas as pd
def add_row(self, row):
    self.loc[len(self.index)] = row
pd.DataFrame.add_row = add_row
于 2016-11-11T18:18:09.947 に答える
0

pandas.DataFrame.append

DataFrame.append(self, other, ignore_index=False, verify_integrity=False, sort=False) → 'DataFrame'

コード

df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'))
df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB'))
df.append(df2)

ignore_index を True に設定した場合:

df.append(df2, ignore_index=True)
于 2020-02-19T06:35:18.530 に答える