向数据帧添加数据

2024-05-14 17:57:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用机器学习技术,使用keras CNN对电磁量热计中释放的能量的“图像”进行分类。为了导入数据,我使用了熊猫数据帧,但是数据没有以必要的方式格式化

量热计可以被认为是一个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)

但是数组以某种奇怪的方式附加到列数据中

有人能告诉我一个有效的方法吗

多谢各位


Tags: 数据方法ineventdataframefor方式range
2条回答

你的arr形状实际上是(4),如果我没有误解的话,你想要的是(1,4)的数组。你可以做arr=np.array([[event,xi,yi,0]])来保持良好的体形

首先,我们为所有事件和晶体创建一个具有多索引的数据帧,并将能量设置为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个事件(新DF有784000行),在我的机器上需要1.5秒

相关问题 更多 >

    热门问题