現在のコードを以下に示します-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列目にあります)
私の質問は、データフレームにシリーズをどのように追加するのですか?私はドキュメントを調べましたが、私がやろうとしていることに合う例はありません。
宜しくお願いします、
ベン
各シリーズは行の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()
を使用できます。ただし、列のデータ型が異なる場合、後者のアプローチは非効率的です。
空のDataFrameを初期化する必要はありません(実行していませんでした。括弧でpd.DataFrame()
が必要です)。
代わりに、各シリーズが列であるDataFrameを作成するには、
series
のリストを作成し、df = pd.concat(series, axis=1)
で水平に連結します何かのようなもの:
series = [pd.Series(mat[name][:, 1]) for name in Variables]
df = pd.concat(series, axis=1)
これを達成するための別の方法、おそらくより高速な方法は、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]