【Python】Pandasのデータフレームの要素に配列を代入したい

環境: python 3.6 pandas 0.22.0

画像のようなデータフレームを作りたいときのメモ。 f:id:gushigo:20180504184131p:plain

下記のようにやればできる。

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'>