web-dev-qa-db-ja.com

パンダ:シリーズからのDataFrameの作成

現在のコードを以下に示します-MATファイルをインポートし、その中の変数からDataFrameを作成しようとしています:

mat = loadmat(file_path)  # load mat-file
Variables = mat.keys()    # identify variable names

df = pd.DataFrame         # Initialise DataFrame

for name in Variables:

    B = mat[name]
    s = pd.Series (B[:,1])

そのため、ループ内で一連の各変数を作成できます(2列の配列です-必要な値は2列目にあります)

私の質問は、データフレームにシリーズをどのように追加するのですか?私はドキュメントを調べましたが、私がやろうとしていることに合う例はありません。

宜しくお願いします、

ベン

30
BMichell

各シリーズは行のDataFrameを作成する方法を次に示します。

単一シリーズの場合(単一行のDataFrameになります):

_series = pd.Series([1,2], index=['a','b'])
df = pd.DataFrame([series])
_

同一のインデックスを持つ複数のシリーズの場合:

_cols = ['a','b']
list_of_series = [pd.Series([1,2],index=cols), pd.Series([3,4],index=cols)]
df = pd.DataFrame(list_of_series, columns=cols)
_

インデックスが異なる可能性がある複数のシリーズの場合:

_list_of_series = [pd.Series([1,2],index=['a','b']), pd.Series([3,4],index=['a','c'])]
df = pd.concat(list_of_series, axis=1).transpose()
_

各シリーズは列であるDataFrameを作成するには、他の人の回答を参照してください。または、上記のように各シリーズが行であるDataFrameを作成し、df.transpose()を使用できます。ただし、列のデータ型が異なる場合、後者のアプローチは非効率的です。

36
Jaan

空のDataFrameを初期化する必要はありません(実行していませんでした。括弧でpd.DataFrame()が必要です)。

代わりに、各シリーズが列であるDataFrameを作成するには、

  1. シリーズ、seriesのリストを作成し、
  2. それらをdf = pd.concat(series, axis=1)で水平に連結します

何かのようなもの:

series = [pd.Series(mat[name][:, 1]) for name in Variables]
df = pd.concat(series, axis=1)
22
TomAugspurger

これを達成するための別の方法、おそらくより高速な方法は、1)dict内包表記を使用して目的のdictを取得する(つまり、各配列の2列目を取得する)2)pd.DataFrameは、各colおよびconcatに対するループなしで、dictから直接インスタンスを作成します。

matが次のようになっていると仮定します(matはファイルからロードされるため、これは無視できます):

In [135]: mat = {'a': np.random.randint(5, size=(4,2)),
   .....: 'b': np.random.randint(5, size=(4,2))}

In [136]: mat
Out[136]: 
{'a': array([[2, 0],
        [3, 4],
        [0, 1],
        [4, 2]]), 'b': array([[1, 0],
        [1, 1],
        [1, 0],
        [2, 1]])}

その後、次のことができます。

In [137]: df = pd.DataFrame ({name:mat[name][:,1] for name in mat})

In [138]: df
Out[138]: 
   a  b
0  0  0
1  4  1
2  1  0
3  2  1

[4 rows x 2 columns]
2
Happy001