Добавление данных в Pandas DataFrame - PullRequest
0 голосов
/ 17 июня 2020

Я хочу использовать методы машинного обучения, чтобы классифицировать «изображения» энергии, выделяемой в электромагнитном c калориметре, используя keras CNN. Для импорта данных я использую Pandas DataFrame, однако данные не отформатированы должным образом.

Калориметр можно рассматривать как кристаллический квадрат 28x28, однако данные, которые я получаю Показывать только энергию в кристаллах, которые сработали, в среднем около 10-15 кристаллов на событие.

   Event X  Y  Energy
   0     22 13 203.49
   0     23 12 73.1848
   ...
   ...
   1     23 16 55.1652
   1     24 16 0
   1     25 16 20.4953

Это означает, что я хочу добавить слой в кадр данных для каждого кристалла (X, Y) которому еще не назначена энергия, и присвоить ему 0 энергии.

Я пробовал следующее:

newdf=pd.DataFrame()

for event in range(0,2):#999):
  for xi in range(0,28):
    for yi in range(0,28):
      arr=np.array([event,xi,yi,0])
      newdf=newdf.append(pd.DataFrame(arr))
      print('newdf = ',newdf)

Но массивы добавляются в данные столбца каким-то странным путь.

Кто-нибудь может подсказать мне эффективный способ сделать это?

Спасибо.

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Сначала мы создаем фрейм данных с MultiIndex для всех событий и кристаллов и устанавливаем Energy равным 0. Затем мы добавляем наш фрейм данных с тем же индексом.

Пример:

df = pd.DataFrame({'Event': [0,0], 'X': [1,1], 'Y': [0,2], 'Energy': [203.49,73.1848]})
#   Event  X  Y    Energy
#0      0  1  0  203.4900
#1      0  1  2   73.1848

n_crystals = 3  # 28 in your case
n_events = 2

idx = pd.MultiIndex.from_product((range(n_events), range(n_crystals), range(n_crystals)), names=['Event','X','Y'])
newdf = pd.DataFrame(index=idx).assign(Energy=0)
newdf = (newdf + df.set_index(['Event','X','Y'])).fillna(0).reset_index()

Результат:

    Event  X  Y    Energy
0       0  0  0    0.0000
1       0  0  1    0.0000
2       0  0  2    0.0000
3       0  1  0  203.4900
4       0  1  1    0.0000
5       0  1  2   73.1848
6       0  2  0    0.0000
7       0  2  1    0.0000
8       0  2  2    0.0000
9       1  0  0    0.0000
10      1  0  1    0.0000
11      1  0  2    0.0000
12      1  1  0    0.0000
13      1  1  1    0.0000
14      1  1  2    0.0000
15      1  2  0    0.0000
16      1  2  1    0.0000
17      1  2  2    0.0000

Для кристаллов 28x28 и 1000 событий (newdf с 784000 строками) на моем компьютере это занимает 1,5 с.

1 голос
/ 17 июня 2020

Ваша форма arr на самом деле (4,), и вы хотите массив (1,4), если я не неправильно понял. Вы можете сделать arr=np.array([[event,xi,yi,0]]), чтобы иметь хорошую форму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...