Могут ли панды df иметь значения ячеек массива numpy - PullRequest
0 голосов
/ 25 сентября 2019

Я хочу хранить массивы Numpy как значения для ячеек в моем Dataframe.Есть какой-либо способ сделать это?В основном у меня есть данные пикселей, которые представляют собой массив (512,512) Numpy, который я хочу сохранить в качестве значения для столбца pixel_data, соответствующего его конкретному идентификатору в столбце идентификатора моего Dataframe.Как я могу это сделать?

Вот что я пытался:

for f in train_files[:10]:
    id_tmp = f.split('/')[4].split('.')[0]
    first_dcm = pydicom.read_file(f)
    img = first_dcm.pixel_array
    window = get_windowing(first_dcm)
    image = window_image(img, *window)
    train.loc[train.Image == id_tmp, 'img_before_w'] = img
    train.loc[train.Image == id_tmp, 'img_after_w'] = image

Ошибка, которую я получил:

ValueError                                Traceback (most recent call last)
<ipython-input-47-32236f8c9ccc> in <module>
      5     window = get_windowing(first_dcm)
      6     image = window_image(img, *window)
----> 7     train.loc[train.Image == id_tmp, 'img_before_w'] = img
      8     train.loc[train.Image == id_tmp, 'img_after_w'] = image
      9 

/opt/conda/lib/python3.6/site-packages/pandas/core/indexing.py in __setitem__(self, key, value)
    203             key = com.apply_if_callable(key, self.obj)
    204         indexer = self._get_setitem_indexer(key)
--> 205         self._setitem_with_indexer(indexer, value)
    206 
    207     def _validate_key(self, key, axis: int):

/opt/conda/lib/python3.6/site-packages/pandas/core/indexing.py in _setitem_with_indexer(self, indexer, value)
    525                     if len(labels) != value.shape[1]:
    526                         raise ValueError(
--> 527                             "Must have equal len keys and value "
    528                             "when setting with an ndarray"
    529                         )

ValueError: Must have equal len keys and value when setting with an ndarray

1 Ответ

0 голосов
/ 25 сентября 2019

Взяв примерный кадр данных, как показано ниже:

train=pd.DataFrame({'Image':[1,2,3,2],'img_before_w':[np.nan, np.nan, np.nan,np.nan]})

print(train) дает

   Image  img_before_w
0      1           NaN
1      2           NaN
2      3           NaN
3      2           NaN

Теперь, например, если вы хотите вставить пиксельные данные, когда train.Image == 2, то этоможет быть достигнуто с помощью кода ниже:

mask = train.Image == 2 # contains True for desired rows
target_index=mask[mask==True].index # gives index of rows, wherever condition is met
train.loc[mask, 'img_before_w'] = pd.Series([[512,512]]*len(target_index), index=target_index)  # inserts [512,512] array in rows wherever condition is met, in given column

Теперь, print(train) дает, желаемый результат:

Image img_before_w
0      1          NaN
1      2   [512, 512]
2      3          NaN
3      2   [512, 512]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...