パンダデータフレームに行を挿入する


111

私はデータフレームを持っています:

s1 = pd.Series([5, 6, 7])
s2 = pd.Series([7, 8, 9])

df = pd.DataFrame([list(s1), list(s2)],  columns =  ["A", "B", "C"])

   A  B  C
0  5  6  7
1  7  8  9

[2 rows x 3 columns]

取得するには、最初の行[2、3、4]を追加する必要があります。

   A  B  C
0  2  3  4
1  5  6  7
2  7  8  9

私が試したappend()concat()の機能が、それを行うにはどのように正しい方法を見つけることができません。

データフレームにシリーズを追加/挿入する方法は?


6
を使用s1.valueslist(s1)てまったく新しいリストを作成するのではなく、使用する方がよいことに注意してくださいlist(s1)
アクシュナー2014年

7
シンプルなはずのものがお尻の痛みでとても遅いのに、なぜ誰もがパンダをとても愛する理由がわかりません。
MattCochrane 2017

回答:


144

以下を使用して、特定のインデックスに行を割り当てるだけlocです。

 df.loc[-1] = [2, 3, 4]  # adding a row
 df.index = df.index + 1  # shifting index
 df = df.sort_index()  # sorting by index

そして、必要に応じて、あなたは得る:

    A  B  C
 0  2  3  4
 1  5  6  7
 2  7  8  9

Pandasのドキュメント「インデックス:拡大による設定」を参照してください。


2
拡大して設定するのではなく、データフレーム内に挿入する場合は、stackoverflow.com
questions / 15888648 /…をご覧ください

6
シフティングインデックスの代替:df.sort()。reset_index(drop = True)
Meloun

2
df.sortは非推奨です。df.sort_index()を使用してください
GBGOLC

1
@Piotr-これはうまくいきますが、などのデータフレームから行を複製してdf.loc[-1] = df.iloc[[0]]挿入したい場合はどうなりますか?フレームにはエラーを示す追加のインデックス列が付属していますValueError: cannot set a row with mismatched columnsstackoverflow.com/questions/47340571/…を参照)
Growler

5
Python配列の場合のように、最後の行/要素ではないためdf.loc[-1] = [2, 3, 4] # adding a row、少し誤解を招くと思い-1ます。
flow2k

26

どのように呼び出しconcat()たかはわかりませんが、両方のオブジェクトが同じタイプである限り機能します。多分問題は、2番目のベクトルをデータフレームにキャストする必要があるということですか?あなたが私のために以下の作品を定義したdfを使用します:

df2 = pd.DataFrame([[2,3,4]], columns=['A','B','C'])
pd.concat([df2, df])

ベストアンサー^ :)
Cam.Davidson.Pilon

23

これを達成する1つの方法は

>>> pd.DataFrame(np.array([[2, 3, 4]]), columns=['A', 'B', 'C']).append(df, ignore_index=True)
Out[330]: 
   A  B  C
0  2  3  4
1  5  6  7
2  7  8  9

通常、系列ではなくデータフレームを追加するのが最も簡単です。あなたの場合、新しい行を(先頭IDで)(先頭のIDで)したくて、関数がないpd.prepend()ため、最初に新しいデータフレームを作成してから、古いデータフレームを追加します。

ignore_indexデータフレーム内の古い進行中のインデックスを無視し、最初の行が実際にindex 1で再開するのではなく、実際にindexで始まることを確認します0

典型的な免責事項:Cetero censeo ...行を追加することは非常に非効率的な操作です。パフォーマンスを重視し、最初に正しい(長い)インデックスでデータフレームを作成し、追加の行をデータフレームに挿入するだけの場合は、確実にそれを行う必要があります。見る:

>>> index = np.array([0, 1, 2])
>>> df2 = pd.DataFrame(columns=['A', 'B', 'C'], index=index)
>>> df2.loc[0:1] = [list(s1), list(s2)]
>>> df2
Out[336]: 
     A    B    C
0    5    6    7
1    7    8    9
2  NaN  NaN  NaN
>>> df2 = pd.DataFrame(columns=['A', 'B', 'C'], index=index)
>>> df2.loc[1:] = [list(s1), list(s2)]

これまでのところ、あなたが持っていたものがありますdf

>>> df2
Out[339]: 
     A    B    C
0  NaN  NaN  NaN
1    5    6    7
2    7    8    9

ただし、次のように行を簡単に挿入できます。スペースは事前に割り当てられているため、これはより効率的です。

>>> df2.loc[0] = np.array([2, 3, 4])
>>> df2
Out[341]: 
   A  B  C
0  2  3  4
1  5  6  7
2  7  8  9

それは良い回避策の解決策です。シリーズをデータフレームに挿入しようとしました。現時点ではそれで十分です。
Meloun、2014年

私は最後のオプションが一番好きです。これは私が本当にやりたいことと本当に一致しています。@FooBarありがとうございます!
Jade Cacho

13

行を挿入するときにもう少し柔軟性を持たせる短い関数をまとめました。

def insert_row(idx, df, df_insert):
    dfA = df.iloc[:idx, ]
    dfB = df.iloc[idx:, ]

    df = dfA.append(df_insert).append(dfB).reset_index(drop = True)

    return df

これをさらに短縮すると、次のようになります。

def insert_row(idx, df, df_insert):
    return df.iloc[:idx, ].append(df_insert).append(df.iloc[idx:, ]).reset_index(drop = True)

次に、次のようなものを使用できます:

df = insert_row(2, df, df_new)

ここ2で、df挿入する場所のインデックス位置ですdf_new


7

使用できますnumpy.insert。これには柔軟性の利点があります。挿入するインデックスを指定するだけです。

s1 = pd.Series([5, 6, 7])
s2 = pd.Series([7, 8, 9])

df = pd.DataFrame([list(s1), list(s2)],  columns =  ["A", "B", "C"])

pd.DataFrame(np.insert(df.values, 0, values=[2, 3, 4], axis=0))

    0   1   2
0   2   3   4
1   5   6   7
2   7   8   9

np.insert(df.values, 0, values=[2, 3, 4], axis=0)0は、新しい値を配置する場所/インデックスを関数に指示します。


6

これは非常に単純に見えるかもしれませんが、単純な新しい行挿入関数が組み込まれていないことは驚くべきことです。元のファイルに新しいdfを追加することについてはたくさん読んだことがありますが、これがもっと速いのではないかと思っています。

df.loc[0] = [row1data, blah...]
i = len(df) + 1
df.loc[i] = [row2data, blah...]

コードが示すように、「新しいdfを追加する」または単に「新しい行を追加する」という意味ですか?
smci

申し訳ありませんが、私の文章は明確ではありませんでした。まったく新しいデータフレームを1行だけ連結または追加する他の人のソリューションを読んだことがあります。しかし、私のソリューションでは、既存のデータフレームの1つの行だけで、追加のデータフレームを作成する必要はありません
アーロン

6

以下は、インデックスをソートおよびリセットせずにパンダデータフレームに行を挿入する最良の方法です。

import pandas as pd

df = pd.DataFrame(columns=['a','b','c'])

def insert(df, row):
    insert_loc = df.index.max()

    if pd.isna(insert_loc):
        df.loc[0] = row
    else:
        df.loc[insert_loc + 1] = row

insert(df,[2,3,4])
insert(df,[8,9,0])
print(df)

なぜこれが最善の方法だと思いますか?
ユカ

次に、その主張を裏付ける証拠を提供するのは良いことです。
ユカ

1
pd.isnaを使用して、numpyのインポートを回避できます
kato2

1

concat()最後の行の挿入と再インデックスよりも少し速いようです。誰かが2つのトップアプローチのスピードについて不思議に思うだろう場合:

In [x]: %%timeit
     ...: df = pd.DataFrame(columns=['a','b'])
     ...: for i in range(10000):
     ...:     df.loc[-1] = [1,2]
     ...:     df.index = df.index + 1
     ...:     df = df.sort_index()

ループあたり17.1 s±705 ms(7回の実行の平均±標準偏差、各1ループ)

In [y]: %%timeit
     ...: df = pd.DataFrame(columns=['a', 'b'])
     ...: for i in range(10000):
     ...:     df = pd.concat([pd.DataFrame([[1,2]], columns=df.columns), df])

ループあたり6.53 s±127 ms(7つの実行の平均±標準偏差、各1ループ)


1

パンダに行を追加するのは非常に簡単DataFrameです:

  1. と同じ列名で通常のPython辞書を作成しますDataframe

  2. pandas.append()methodを使用してディクショナリの名前を.append()渡します。はDataFrameインスタンスのメソッドです。

  3. ignore_index=True辞書名の直後に追加します。


これはおそらく最も好ましいオプションです(2020年頃)。
David Golembiowski

0

DataFrameの最後に行を追加し、インデックスを調整するだけです。

例えば:

df = df.append(pd.DataFrame([[2,3,4]],columns=df.columns),ignore_index=True)
df.index = (df.index + 1) % len(df)
df = df.sort_index()

または次のように使用concatします:

df = pd.concat([pd.DataFrame([[1,2,3,4,5,6]],columns=df.columns),df],ignore_index=True)

-1

パンダデータフレームに行を追加する最も簡単な方法は次のとおりです。

DataFrame.loc[ location of insertion ]= list( )

例:

DF.loc[ 9 ] = [ ´Pepe , 33, ´Japan ]

注意:リストの長さはデータフレームの長さと一致する必要があります。


私のためにトリックをしました!
サム・ショー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.