HOWTO · Pandas

Pandas Build DataFrame 行ごと

この記事では、Pandas で習慣的に従う列方向の規則ではなく、行方向のデータフレームを構築する方法を示します。

この記事では、Pandas で習慣的に従う列単位の規則ではなく、行単位のデータフレームを構築する方法を示します。

Pandas DataFrame で行を作成する

Pandas DataFrame は、2つの次元とそれらの次元に対応するラベルを持つデータを格納する構造です。 DataFrame は、Excel や Calc などのアプリケーションで操作できる SQL テーブルやスプレッドシートに匹敵します。

これらは Python および NumPy エコシステムの不可欠なコンポーネントであるため、DataFrame は多くの場合、速度、使いやすさ、パワーの点でテーブルやスプレッドシートよりも優れています。 これは、多くのアプリケーションに当てはまります。

データ格納構造として、特定の条件に基づいて、列ごとではなく行ごとにデータを入力する必要がある場合があります。

次のコードを検討してください。

import pandas

df = pandas.DataFrame(
    columns=["a", "b", "c", "d", "e"], index=["v", "w", "x", "y", "z"]
)
y = {"a": 1, "b": 5, "c": 2, "d": 3, "e": 7}

print("Attempt 1")
# df['y'] = y
# print(df)

print("Attempt 2")
# df.join(y)

各試行の次の出力は、個別に書き込まれます。

出力 (試行 1):

Attempt 1
     a    b    c    d    e   y
v  NaN  NaN  NaN  NaN  NaN NaN
w  NaN  NaN  NaN  NaN  NaN NaN
x  NaN  NaN  NaN  NaN  NaN NaN
y  NaN  NaN  NaN  NaN  NaN NaN
z  NaN  NaN  NaN  NaN  NaN NaN

出力 (試行 2):

Traceback (most recent call last):
  File "d:\Test\test.py", line 13, in <module>
    df.join(y)
  File "C:\Program Files\Python310\lib\site-packages\pandas\core\frame.py", line 9969, in join
    return self._join_compat(
  File "C:\Program Files\Python310\lib\site-packages\pandas\core\frame.py", line 10036, in _join_compat
    can_concat = all(df.index.is_unique for df in frames)
  File "C:\Program Files\Python310\lib\site-packages\pandas\core\frame.py", line 10036, in <genexpr>
    can_concat = all(df.index.is_unique for df in frames)

AttributeError: 'builtin_function_or_method' object has no attribute 'is_unique'

上記のコードでは、最初に DataFrame インスタンスが初期化され、列 ['a','b','c','d', 'e'] とインデックス ['v', 'w',' が使用されます。 x','y','z']. 主な目的は、要素を行単位で追加することです。これは、この場合のコードから明らかなように、y です。

入力に入力されるデータは、{'a':1, 'b':5, 'c':2, 'd':3, 'e': 7} として指定された各列に対応する値で初期化されます。

試行 1 では、作成されたデータは、df[y] を使用してインデックス y に設定することにより、DataFrame に割り当てられます。 しかし、出力からわかるように、他のすべての要素と同様に、すべてのメンバーが NaN である新しい列が作成されます。

2 回目の試行では、join() メソッドを使用して、宣言されたデータを DataFrame 自体に結合しようとしますが、これもエラーを発生させます。 この問題には、以下で説明する次の手法を使用してアプローチできます。

  • loc() 関数の使用。
  • pandas.concat() 関数の使用。

loc() 関数を使用して Pandas DataFrame に行を作成する

次のコードを検討してください。

import pandas

df = pandas.DataFrame(
    columns=["a", "b", "c", "d", "e"], index=["v", "w", "x", "y", "z"]
)
print("Current Shape:\n" + str(df))

y = {"a": 1, "b": 5, "c": 2, "d": 3, "e": 7}
df.loc["y"] = pandas.Series(y)

print("DataFrame:\n" + str(df))

出力:

Current Shape:

     a    b    c    d    e
v  NaN  NaN  NaN  NaN  NaN
w  NaN  NaN  NaN  NaN  NaN
x  NaN  NaN  NaN  NaN  NaN
y  NaN  NaN  NaN  NaN  NaN
z  NaN  NaN  NaN  NaN  NaN

DataFrame:

     a    b    c    d    e
v  NaN  NaN  NaN  NaN  NaN
w  NaN  NaN  NaN  NaN  NaN
x  NaN  NaN  NaN  NaN  NaN
y    1    5    2    3    7
z  NaN  NaN  NaN  NaN  NaN

DataFrame クラスの loc プロパティは、DataFrame の行または列にアクセスするために使用されます。 loc プロパティを使用すると、単一またはグループの行と列、およびブール配列にアクセスできます。

このコードでは、プロパティがラベルベースであるため、loc プロパティを使用しました。 したがって、目的のラベル (またはインデックス)、この場合は y を渡しました。

panda.Series() は、すべての要素を指定する必要がない場合に備えて、入力を揃えるためのものであることに注意してください。

pandas.concat() 関数を使用して Pandas DataFrame に行を作成する

次のコードを検討してください。

import pandas

df = pandas.DataFrame(columns=["a", "b", "c", "d", "e"], index=[])
print("Current Shape:\n" + str(df))

entry = pandas.DataFrame.from_dict(
    {
        "a": [1, 6, 11, 16],
        "b": [2, 7, 12, 17],
        "c": [3, 8, 13, 18],
        "d": [4, 9, 14, 19],
        "e": [5, 10, 15, 20],
    }
)

df = pandas.concat([df, entry])
print("DataFrame:\n" + str(df))

出力:

Current Shape:
Empty DataFrame
Columns: [a, b, c, d, e]
Index: []
DataFrame:
    a   b   c   d   e
0   1   2   3   4   5
1   6   7   8   9  10
2  11  12  13  14  15
3  16  17  18  19  20

列名とそれに対応する値を含む辞書を含む from_dict() メソッドが宣言され、そこから新しい DataFrame が作成されます。 この新しく作成された DataFrame インスタンスは、元の DataFrame に追加する新しい要素に対応する entry という名前の変数に格納されます。

DataFrame が作成され、データが DataFrame に割り当てられたら、2つの DataFrame インスタンスを結合する方法を見つける必要があります。 pandas.concat() メソッドを使用して、2つの DataFrame インスタンスを連結し、結果の DataFrame を最初のインスタンスに格納します。