Python 熊猫:键值对的多个枢轴。。。更快的方式? 如何将第一个表转换为第二个表(fast和

Python 熊猫:键值对的多个枢轴。。。更快的方式? 如何将第一个表转换为第二个表(fast和,python,pandas,numpy,Python,Pandas,Numpy,我有以“键值对”格式存储在数据库中的数据。当我查询数据时,我会返回这种“扁平化”的表,我需要通过基本上旋转每对键值列来取消扁平化它。如果您查看下面的示例表,就会更容易理解 与其他相关问题不同,我有一些不同的规则/限制: 在查询数据之前,我不知道哪些键、值或键值对将丢失 键值列名始终由“key####”和“value####”标识,其中##是一些数字 ####号标识该对(例如,键_1与值_1配对;键_2与值_3不配对) 钥匙始终为字母数字字符或缺失 该值始终为数字或缺失 并非所有行都有每个键值对

我有以“键值对”格式存储在数据库中的数据。当我查询数据时,我会返回这种“扁平化”的表,我需要通过基本上旋转每对键值列来取消扁平化它。如果您查看下面的示例表,就会更容易理解

与其他相关问题不同,我有一些不同的规则/限制:

  • 在查询数据之前,我不知道哪些键、值或键值对将丢失
  • 键值列名始终由“key####”和“value####”标识,其中##是一些数字
  • ####号标识该对(例如,键_1与值_1配对;键_2与值_3不配对)
  • 钥匙始终为字母数字字符或缺失
  • 该值始终为数字或缺失
  • 并非所有行都有每个键值对(例如,在下表中,条目_idb有键值N,但A没有)
  • 有时有一个键,但缺少值(例如,在下表中,键_4不缺少,但值_4缺少)
  • 如果存在非缺失值,则将存在非缺失键
  • 一个键列中可能有多个唯一的键名(例如,键0有N和O)
  • 如果一个键出现在一个键列中,它将不会出现在任何其他键列中(例如,键0既有N也有O,但都不会出现在任何其他键列中)
为了降低抽象层次。。。将我的数据视为代表对唯一样本的一组测试结果,其中并非所有样本都得到相同的测试。行条目_ID表示唯一的样本。键表示其中一个测试,值是该测试的结果。并不是所有的样品都得到相同的测试。一些样本进行了测试,但没有完成,因此缺少结果。例如,在下表中,样本A得到了测试P和Q,但样本B只得到了测试N

但是,测试会随时间而变化,但数据库不会。因此,测试和结果被上传到数据库中相同的命名列中。这使我无法简单地使用更改列名(例如,对于键\ 1/值\ 1,我可以将值\ 1更改为“P”并完成,但对于键\ 0/值\ 0则不起作用)。下面的例子是一个简化的小案例

我的典型查询将是至少10k行,其中至少有300个key-val-pair列,其中有300多个唯一键,这些键需要转换为更合理的格式进行分析。它们的键是更长的字符串,值是浮点数。。。这就是我的问题。谢谢

第一张表:

输入\u ID键\u 0值\u 0键\u 1值\u 1键\u 2值\u 2键\u 3值\u 3键\u 4值
0 A None NaN P 183.0 Q 238.0 None NaN R NaN
1 B N 886.0无NaN无NaN无NaN R NaN
2 C N 156.0 P 905.0 Q 566.0无NaN R NaN
3 D N 843.0 P 396.0无NaN无NaN R NaN
4 E无NaN无NaN Q 118.0无NaN R无NaN
5 F N 719.0 P 721.0 Q 526.0无NaN R NaN
6 G N 894.0 P 136.0 Q 438.0无NaN R NaN
7 H None NaN P 646.0 None NaN None NaN R NaN
8 I N 447.0 P 978.0 Q 458.0无NaN R NaN
9 J None NaN None NaN Q 390.0 None NaN R NaN
10 K O 843.0 P 745.0 Q 107.0无NaN R NaN
11 L O 882.0无NaN无NaN无NaN R NaN
12 M O 382.0 P 876.0 Q 829.0无NaN R NaN

第二张表:

我不知道该怎么办
0A楠楠183.0238.0
1 B 886.0楠楠楠楠楠
2 C 156.0 NaN 905.0 566.0
三维843.0纳米396.0纳米
4东南118.0
5F 719.0 NaN 721.0 526.0
6 G 894.0 NaN 136.0 438.0
7小时南646.0南
8 I 447.0 NaN 978.0 458.0
9J楠楠390.0
10kNaN 843.0745.0107.0
11 L NaN 882.0 NaN NaN
12米南382.0 876.0 829.0


创建上述第一个表的可复制示例(需要Python 3、pandas和numpy,TQM是可选的)

导入熊猫、字符串、itertools、numpy、时间、操作系统
#从TQM导入TQM
某些字母=string.ascii\u大写
N_KEYVAL_对=100
可扩展=3
条目_ID=[''.join(x)表示列表中的x(itertools.permutations(一些_字母[:13],r=SCALABLE))#对于前13个字母,n=154440,r=5
source_keys=[''.join(x)表示列表中的x(itertools.permutations(一些_字母[13:],r=SCALABLE))。#对于前13个字母,n=154440,r=5
迪克
迪克['entry\u ID']=entry\u ID
value\u col\u names=['value\uu'+str(x)表示范围内的x(N\u KEYVAL\u对)]
key_col_names=['key_'+str(x)表示范围内的x(N_KEYVAL_对)]
目录列表=['entry\u ID']
源\键\计数=0
#对于keycol,zip中的valcol(tqdm(key\u col\u name)、value\u col\u name):
对于keycol,zip中的valcol(key\u col\u name,value\u col\u name):
dummy\u values=numpy.random.randint(1,high=1000,size=len(条目ID),dtype=l')
n_not_null=int(len(条目ID)*0.75)#大约25%的数据为null
n_nulls=len(条目ID)-n_not_null
dum_vals=numpy.concatenate((numpy.full(n_null,numpy.nan),dummy值[:n_not_null]))
numpy.random.shuffle(dum_vals)#就位!
虚拟密钥=numpy.full(len(dum\u vals),源密钥[源密钥计数],数据类型=对象)
如果numpy.isnan(dum_vals[0]):
资料来源