我已经将标签页中的文件中的数据加载到DF中。 Tab数据是用模板填写的表单。
一个关键概念是可变行数构成一个条目的形式。在下面的DF1中,每当索引为“ A”时,就会开始一个新记录。因此,代码将需要遍历行以重建DF2中的每个记录。 每条记录将在DF2中表示为一行。
基于事实,DF1中的每个“ A”行都开始一个新的表单条目(以及DF2中的对应行),我们可以在下面的DF1中看到,在我的示例中只有两个条目,而在DF2中只有两个行。 Also imortant:每行中有不同数量的数据(列)。 Z具有2个(然后是NA),A具有3个,B具有4个。
所有这些都需要根据索引字母Z,A,B映射到DF2(请注意,还有更多的索引字母,但是此示例对此进行了简化)。
DF 1
- A B C D
Z xyz 5 NA NA
A COA aa bb NA
B RE 01 02 03
B DE 04 05 06
A COB dd ee NA
B RE 01 02 03
B DE 04 05 06
过去,我已经在VBA中完成了这种事情,并且会使用CASE语句来转换数据。我发现在此线程中使用字典是一个很好的开始:
Replacements for switch statement in Python?
以上线程中的一个代码示例建议使用字典类型的case语句:
return{
'a': 1,
'b': 2,
}[x]
尽管我不确定在实践中如何执行,但这似乎可行。除了上面的每个A,B等,我还需要输出多个指令,具体取决于索引字母。在大多数情况下,说明是在DF2中的映射位置。例如,在我的:
索引A:将列A映射到DF2.iloc[1]['B']
将B列映射到DF2.iloc[1]['C']
将列C映射到DF2.iloc[1]['D']
索引B:与上面类似,将有四个指令。
DF2最终看起来像这样
- A B C D E F G H I J K L
1 xyz COA aa bb RE 01 02 03 DE 04 05 06
2 xyz COB dd ee RE 01 02 03 DE 04 05 06
因此,对于DF1中的每一行,将根据“索引字母”执行不同数量的指令。 所有指令都告诉代码将数据放置在DF2中的位置。列的每个不同索引字母的映射指令将始终相同,只有行将被更改(某些类型的计数器当您从DF2中的一个记录组移至下一个记录组时。
如何为开关/大小写类型格式的每种索引字母处理不同数量的指令?
谢谢
#filter only 2,3 index rows
df1 = df[df.index.isin([2,3])].copy()
#create new column for same value if 2 in index
df1['new'] = np.where(df1.index == 2, 'Z', df1.A)
#create groups by compare 2
df1['g'] = (df1.index == 2).cumsum()
#convert columns to index and reshape, then change order
df1 = (df1.set_index(['g','new']).unstack()
.swaplevel(0,1, axis=1)
.sort_index(axis=1, ascending=[False, True]))
#default columns names
df1.columns = range(len(df1.columns))
print (df1)
0 1 2 3 4 5 6 7 8 9 10 11
g
1 ABC aa bb cc R 01 02 NaN D NaN 03 04
2 DEF dd ee ff R 01 02 NaN D NaN 03 04