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,但都不会出现在任何其他键列中)
输入\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]):
资料来源