【Python】Pandasのデータフレームの要素に配列を代入したい
環境: python 3.6 pandas 0.22.0
画像のようなデータフレームを作りたいときのメモ。
下記のようにやればできる。
array_1d = np.ones(2) array_2d = np.ones([1, 2]) * 2 df.loc[0, 'obj'] = array_1d df.loc[[1], 'obj'] = [array_2d] #別解1 df['obj'] = [array_1d, array_2d]
思いのほか難しい。 numpy配列の次元によって代入方法を変えないといけない。 pandasのsetter部分を読めばちゃんと理解できるかも。
import pandas as pd import numpy as np df = pd.DataFrame(np.zeros([2,2]), columns=['num', 'obj']) df['obj'] = df['obj'].astype('object') #成功 df.loc[0, 'obj'] = array_1d df.loc[[1], 'obj'] = [array_2d] df['obj'] = [array_1d, array_2d] df.loc[:, 'obj'] = [array_1d, array_2d] #ちなみにこれもできる df['obj'] = [array_1d, array_1d] df['obj'] = [array_2d, array_2d] df.loc[:, 'obj'] = [array_2d, array_2d] #失敗(エラー) #ValueError: Must have equal len keys and value when setting with an ndarray df.loc[0, 'obj'] = [array_1d] df.loc[[0], 'obj'] = [array_1d] df.loc[[0], ['obj']] = [array_1d] df.loc[[0], 'obj'] = [array_1d] df.loc[0, 'obj'] = array_1d df.loc[1, 'obj'] = array_2d df.loc[:, 'obj'] = [array_1d, array_1d] #失敗(形式が異なる) df.loc[0, ['obj']] = [[array_1d]] df.loc[[0], ['obj']] = [[array_1d]] df.loc[[0], 'obj'] = [[array_1d]]
ちなみにtypeは下記の関係
print('1', type( df.loc[0, 'num'] ) ) print('2', type( df.loc[[0], 'num'] ) ) print('3', type( df.loc[0, 'obj'] ) ) print('4', type( df.loc[[0], 'obj'] ) ) print('5', type( df.loc[[0], ['obj']] ) ) print('6', type( df.loc[0, ['obj']] ) ) ########## #出力結果 ########## 1 <class 'numpy.float64'> 2 <class 'pandas.core.series.Series'> 3 <class 'float'> 4 <class 'pandas.core.series.Series'> 5 <class 'pandas.core.frame.DataFrame'> 6 <class 'pandas.core.series.Series'>